簡體   English   中英

AMD64 指令指針中的奇怪行為

[英]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.

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