返回地址我用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
爲什麼我看不到返回地址?對於長期的問題抱歉。在此先感謝
你有多少''獲取'字符串?覆蓋返回地址正是如何使用緩衝區溢出來運行惡意代碼... – StoryTeller
@StoryTeller,因爲我已經在問題中提到過。我在gets處設置了一箇中斷,因此並沒有輸入任何內容。問題是我沒有看到返回地址 –
@StoryTeller我從來沒有聽說過堆棧正在向下發展。你能詳細說明這一點嗎? –