我正在阅读《黑客:剥削的艺术》一书,第二版,以及简单的 C 程序
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 10; i++)
{
puts("Hello, world!\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
书上列出gdb调试会先修改ebp寄存器:
(gdb) x/i $eip 0x8048384 <main+16>: mov DWORD PTR [ebp-4],0x0
Run Code Online (Sandbox Code Playgroud)
正如它所解释的, 这条汇编指令会将 0 的值移动到位于 EBP 寄存器中存储的地址减去 4 的内存中。这是 C 变量 i 存储在内存中的位置;i 被声明为在 x86 处理器上使用 4 字节内存的整数
这对我来说很有意义,但是当我在我的“非常旧的 I386”Linux 笔记本电脑上测试确切的步骤时,我得到的是:
(gdb) x/i $eip => 0x4011b6 <main+29>: mov DWORD PTR [ebp-0xc],0x0
Run Code Online (Sandbox Code Playgroud)
所以在我的笔记本电脑上,它显示 [ebp-0xc],而不是 [ebp-4]。根据我的理解,“0xc”作为十六进制将是12,所以它将是12个再见?如果是这样,为什么?
这是我的笔记本电脑上这个简单程序(gdb)反汇编主程序的整个汇编转储
(gdb) x/i $eip 0x8048384 <main+16>: mov DWORD PTR [ebp-4],0x0
Run Code Online (Sandbox Code Playgroud) 我正在学习"黑客攻击艺术".我试图遵循代码示例,但由于某种原因,汇编代码与我实际的linux上的汇编代码不匹配(在虚拟盒上作为Guest运行).我已经确定我已经安装了32位Linux操作系统.有没有我可以传递给gcc的args,它允许我将代码编译成一个与书中给出的内容紧密匹配的程序集?
我会很好地协调书中的代码差异和我看到的如果它们是次要的,但我看到的差别是鲜明的.我不知道如何从"预配置的孵化器环境"运行代码,因为这会抑制我的技能发展.