簡體   English   中英

為什么在此緩沖區溢出嘗試中eip不會改變?

[英]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跳躍leaveret干脆。 ret是更改eip的指令,它必須等效於pop eip 但是leave之前先修改堆棧指針espebp (尤其是因為當我覆蓋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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM