我正在關注堆疊上陣列緩沖區溢位的這篇文章,進行 ROP 攻擊以呼叫通常不會被呼叫的函式。
有三個功能。漏洞,標志和主要。
main 只是呼叫了 vuln,而 vuln 有一個 180 位元組的堆疊溢位。
int main()
{
vuln();
}
void vuln()
{
char buf[180];
gets(buf);
}
標志沒有被呼叫并且有兩個引數:
void flag(int param1, int param2) { }
它存在于地址 0x080491e2 上。
flasg 可以通過用 8 個額外位元組溢位 180 的緩沖區然后添加 EIP 獲取的地址來呼叫。
python -c "print('A'*188 '\xe2\x91\x04\x08')"
到目前為止一切順利, flag 被呼叫但沒有引數。要使用引數呼叫 flag,我們必須在 flag 的地址和整數的兩個值之后添加 'A'*4,它們之間有一個 '\r'。
python -c "print('A'*188 '\xe2\x91\x04\x08' 'A'*4 '\xef\xbe\xad\xde\r\xd0\xde\xc0')"
我不明白為什么需要 'A'*4,這里覆寫了哪些堆疊部分?還有引數之間的“\r”,如果它不存在,它就不起作用。'\r' 有什么功能?
uj5u.com熱心網友回復:
這AAAA是因為在進入 時flag,它期望堆疊頂包含它的回傳地址,引數從 4 個位元組開始。您不關心flag是否能夠回傳,因此您只需要 4 個位元組的垃圾來代替回傳地址。
至于\r,它不在引數之間(它們應該在記憶體中相鄰并且它們之間不能有任何位元組);相反,它實際上是第二個引數的第一個(最不重要的)位元組。ASCII 回車\r有數值0x0d,所以你的引數是0xdeadbeef, 0xc0ded00d. 我不知道他們為什么寫低位元組\r而不是\x0d哪個會更一致。也許它是由某個程式自動從二進制轉義為十六進制轉義的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/337098.html
上一篇:帶有兩個條件的while回圈由HLA中的AND運算子連接。將C 轉換為HLA
下一篇:常見顫振錯誤(缺少必需的引數)
