[英]Strange behavior in AMD64 Instruction pointer
我正在閱讀 Jon Erickson 的 Hacking: The Art of Exploitation,並在我的 Kali Linux 系統(64 位)中遵循書中的示例。
我寫了一個簡單的C程序:
#include<stdio.h>
int main()
{
int i;
for(i=0;i<10;i++)
{
printf("Hello");
}
}
在使用 objdump 和 gdb 檢查可執行文件后,我發現了一些奇怪的東西。
如圖所示,主函數在“0x000000000000063a”中。
但是gdb“運行”命令后的斷點信息,似乎程序停在63e而不是63a。
另一個奇怪的事情是指令指針(rip)中的值是 0x55555555463e。 不應該是 0x000000000000063a 嗎? 那5
從哪里來?
如果您不設置星號,GDB 會在函數的有用代碼上設置斷點。 它省略了函數(序言)的所有准備工作。 為了清楚起見,請嘗試調試以下代碼:
#include <stdio.h>
int main()
{
int i=10;
i++;
return 0;
}
Gdb 會話:
(gdb) b main
Breakpoint 1 at 0x80483e1
(gdb) b *main
Breakpoint 2 at 0x80483db
(gdb) r
Starting program: /home/src/main
Breakpoint 2, 0x080483db in main ()
(gdb) disas
Dump of assembler code for function main:
=> 0x080483db <+0>: push ebp
0x080483dc <+1>: mov ebp,esp
0x080483de <+3>: sub esp,0x10
0x080483e1 <+6>: mov DWORD PTR [ebp-0x4],0xa
0x080483e8 <+13>: add DWORD PTR [ebp-0x4],0x1
0x080483ec <+17>: mov eax,0x0
0x080483f1 <+22>: leave
0x080483f2 <+23>: ret
End of assembler dump.
(gdb) c
Continuing.
Breakpoint 1, 0x080483e1 in main ()
(gdb) disas
Dump of assembler code for function main:
0x080483db <+0>: push ebp
0x080483dc <+1>: mov ebp,esp
0x080483de <+3>: sub esp,0x10
=> 0x080483e1 <+6>: mov DWORD PTR [ebp-0x4],0xa
0x080483e8 <+13>: add DWORD PTR [ebp-0x4],0x1
0x080483ec <+17>: mov eax,0x0
0x080483f1 <+22>: leave
0x080483f2 <+23>: ret
End of assembler dump.
在這種情況下,執行函數有用代碼的准備工作是:
0x080483db <+0>: push ebp
0x080483dc <+1>: mov ebp,esp
0x080483de <+3>: sub esp,0x10
main
第一條指令:
int i=10;
編譯成:
mov DWORD PTR [ebp-0x4],0xa
GDB 在指令上設置斷點,當我們給出命令b main
但是如果我們使用帶有星號(指針) b *main
的命令,我們會在函數的實際地址上設置一個斷點(在序言的第一條指令上)。
在 OP 的情況下,如果我們通過break *main
設置斷點然后run
,則指令指針寄存器( rip
)的值為0x55555555463a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.