2017-01-19 31 views
0

返回地址我用C寫的程序(只用於調試):找不到在gdb

void return_input(void) 
{ 
    char array[10]; 

    gets(array); 
    printf("%s\n", array); 
} 

main() 
{ 
    return_input(); 

    return 0; 

}

我一直在嘗試堆棧溢出,因爲我有工作64位機我

gcc -m32 -mpreferred-stack-boundary=2 -ggdb overflow.c -o overflow 

然後我gdb調試使用程序編譯它,拆開return_input功能,我得到:

0x0804841b <+0>: push %ebp 
    0x0804841c <+1>: mov %esp,%ebp 
    0x0804841e <+3>: sub $0xc,%esp 
    0x08048421 <+6>: lea -0xa(%ebp),%eax 
    0x08048424 <+9>: push %eax 
    0x08048425 <+10>: call 0x80482e0 <[email protected]> 
    0x0804842a <+15>: add $0x4,%esp 
    0x0804842d <+18>: lea -0xa(%ebp),%eax 
    0x08048430 <+21>: push %eax 
    0x08048431 <+22>: call 0x80482f0 <[email protected]> 
    0x08048436 <+27>: add $0x4,%esp 
    0x08048439 <+30>: nop 
    0x0804843a <+31>: leave 
    0x0804843b <+32>: ret 

這標誌着返回地址應0x0804843b(或不是嗎?)但是,檢查ESP時(記住這是一個64位機器上編譯程序的32位)與x/20x $esp(在設置斷點後獲取函數和ret),我無法找到返回地址:

0xffffd400: 0xffffd406 0x080481ec 0x08048459 0x00000000 
    0xffffd410: 0xffffd418 0x08048444 0x00000000 0xf7e195f7 
    0xffffd420: 0x00000001 0xffffd4b4 0xffffd4bc 0x00000000 
    0xffffd430: 0x00000000 0x00000000 0xf7fb0000 0xf7ffdc04 
    0xffffd440: 0xf7ffd000 0x00000000 0xf7fb0000 0xf7fb0000 

爲什麼我看不到返回地址?對於長期的問題抱歉。在此先感謝

+0

你有多少''獲取'字符串?覆蓋返回地址正是如何使用緩衝區溢出來運行惡意代碼... – StoryTeller

+0

@StoryTeller,因爲我已經在問題中提到過。我在gets處設置了一箇中斷,因此並沒有輸入任何內容。問題是我沒有看到返回地址 –

+0

@StoryTeller我從來沒有聽說過堆棧正在向下發展。你能詳細說明這一點嗎? –

回答

2

0x0804843b是'ret'。看起來你用'返回地址'來弄糊塗了。返回地址是在調用函數中執行的下一條指令的地址。特別對於此代碼:

0x08048425 <+10>: call 0x80482e0 <[email protected]> 
    0x0804842a <+15>: add $0x4,%esp 

返回地址是0x0804842a。

現在,你不知道你到底做了什麼。按照你的指定編譯,'break gets'+'run'對我來說工作得很好。你確定你是從「內部」獲取regs嗎?

(gdb) disassemble return_input 
Dump of assembler code for function return_input: 
    0x0804843b <+0>: push %ebp 
    0x0804843c <+1>: mov %esp,%ebp 
    0x0804843e <+3>: sub $0xc,%esp 
    0x08048441 <+6>: lea -0xa(%ebp),%eax 
    0x08048444 <+9>: push %eax 
    0x08048445 <+10>: call 0x8048300 <[email protected]> 
    0x0804844a <+15>: add $0x4,%esp 

這就是應該返回的指令。

0x0804844d <+18>: lea -0xa(%ebp),%eax 
    0x08048450 <+21>: push %eax 
    0x08048451 <+22>: call 0x8048310 <[email protected]> 
    0x08048456 <+27>: add $0x4,%esp 
    0x08048459 <+30>: nop 
    0x0804845a <+31>: leave 
    0x0804845b <+32>: ret  
End of assembler dump. 

(gdb) break gets 
Breakpoint 1 at 0x8048300 
(gdb) run 
[..] 
Breakpoint 1, 0xf7e3a005 in gets() from /lib/libc.so.6 
(gdb) x/20x $esp 
0xffffd160: 0x00000001 0xf7fa3000 0xffffd180 0x0804844a 

而這裏是第四位。

0xffffd170: 0xffffd176 0x0804820c 0x08048479 0x00000000 
0xffffd180: 0xffffd188 0x08048464 0x00000000 0xf7df15a6 
0xffffd190: 0x00000001 0xffffd224 0xffffd22c 0x00000000 
0xffffd1a0: 0x00000000 0x00000000 0xf7fa3000 0xf7ffdbe4 
(gdb) 
+0

這裏有三個問題:1)如果返回地址不是從函數返回後要執行的下一條指令的地址,那麼它是什麼?2)我應該溢出哪個地址才能得到分段錯誤? 3)爲什麼我無法在'x/20x $ esp'命令中找到'ret'地址? –

+0

1.您首先傾向於什麼堆棧狀態? 2.你需要覆蓋保存返回地址的位置,還有什麼。 3.你爲什麼在尋找'ret'的地址以及你在哪裏bt。一般來說,我只能推薦你閱讀關於這個主題的經典:http://phrack.org/issues/49/14.html –