gpt4 book ai didi

c - AMD64 指令指针中的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:02 27 4
gpt4 key购买 nike

我正在阅读 Jon Erickson 的《黑客攻击:剥削的艺术》,并在我的 Kali Linux 系统(64 位)中按照书中的示例进行操作。

我写了一个简单的 C 程序:

#include<stdio.h>
int main()
{
int i;
for(i=0;i<10;i++)
{
printf("Hello");
}
}

在使用 objdump 和 gdb 检查可执行文件后,我发现了一些奇怪的东西。

Screenshot

如图所示,main函数在“0x000000000000063a”中。

但是 gdb“运行”命令后的断点信息,似乎程序停止在 63e 而不是 63a。

另一个奇怪的事情是指令指针 (rip) 中的值是 0x55555555463e。不应该是 0x000000000000063a 吗?这些 5 来自哪里?

最佳答案

如果您不设置星号,GDB 会在函数的有用代码上设置断点。它省略了函数(序言)的所有准备工作。为了清楚起见,请尝试调试以下代码:

#include <stdio.h>

int main()
{
int i=10;
i++;
return 0;
}

Gdb session :

(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

关于c - AMD64 指令指针中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48901609/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com