相关疑难解决方法(0)

在《剥削艺术》示例中,对 [ebp-0xc] 而不是 [ebp-4] 感到困惑

我正在阅读《黑客:剥削的艺术》一书,第二版,以及简单的 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)

x86 assembly gcc

5
推荐指数
1
解决办法
1108
查看次数

"黑客剥削艺术" - 集会不一致

我正在学习"黑客攻击艺术".我试图遵循代码示例,但由于某种原因,汇编代码与我实际的linux上的汇编代码不匹配(在虚拟盒上作为Guest运行).我已经确定我已经安装了32位Linux操作系统.有没有我可以传递给gcc的args,它允许我将代码编译成一个与书中给出的内容紧密匹配的程序集?

我会很好地协调书中的代码差异和我看到的如果它们是次要的,但我看到的差别是鲜明的.我不知道如何从"预配置的孵化器环境"运行代码,因为这会抑制我的技能发展.

assembly gcc gdb

1
推荐指数
2
解决办法
4012
查看次数

标签 统计

assembly ×2

gcc ×2

gdb ×1

x86 ×1