[英]Why does eip doesn't change in this buffer overflow attempt?
我正在嘗試處理緩沖區溢出。 我不知道eip的價值在這里發生了什么。
這是C代碼:
void copy(char *arg) {
char msg[256];
strcpy(msg,arg);
}
它的組裝:
0x804847d <copy+25>: call 0x8048368 <strcpy@plt>
0x8048482 <copy+30>: leave
0x8048483 <copy+31>: ret
我輸入一個像“ _ \\ xAA \\ xBB \\ xCC \\ xDD”這樣的字符串作為參數,其大小經過計算,以便最后4個字節將是$ ebp之后的4個字節(以覆蓋實際的返回地址)。 而且似乎可行。
在gdb中:
(break before strcpy)
x/2wx $ebp
0xbffffb38: 0xbffffb58 0x080484d2
n
(just after strcpy execution)
x/2wx $ebp
0xbffffb38: 0x80cdd189 0x080484b6
...
n
...
x/2wx $ebp
0xbffffb38: 0x80cdd189 0x080484b6
所以返回地址是0x080484d2
,在我溢出后返回的地址是0x080484b6
,這就是我想要的。 但是程序退出:“無法訪問地址0x80cdd18d的內存”。
我不知道為什么未將$ eip設置為我的地址,並且由於代碼的地址為0x08048 ...我非常有信心$ ebp + 4是包含返回地址的地方
我再次嘗試使用較小的4個字節的字符串,這一次它覆蓋了$ ebp而不是$ ebp + 4,並且在返回之后,將$ eip設置為$ ebp + 4中包含的值
有什么解釋嗎?
好的,謝謝@Wumpus Q. Wumbley,這有助於我理解事情。
做next
跳躍leave
和ret
干脆。 ret
是更改eip
的指令,它必須等效於pop eip
。 但是leave
之前先修改堆棧指針esp
和ebp
(尤其是因為當我覆蓋ebp + 4時,我更改了ebp包含的值)
TLDR:不覆蓋ebp的值會使它成功工作。
如果這是針對x86(而不是x86-64)的,則通常的函數序言包括推入ebp
,然后為其分配esp
的值,這會將返回地址留在堆棧上的地址為ebp+4
。
看一下函數的反匯編,看看第一條指令是否看起來像這樣:
pushl %ebp
movl %esp, %ebp
如果是這樣,這就是偏移的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.