粉碎堆栈example3.c混乱

9 c stack-overflow buffer-overflow disassembly

文章可以在这里找到.

我正在读取粉碎堆栈并发现自己被卡在example3.c上.

0x80004a3 <main+19>:    call   0x8000470 <function>
0x80004a8 <main+24>:    addl   $0xc,%esp
0x80004ab <main+27>:    movl   $0x1,0xfffffffc(%ebp)
0x80004b2 <main+34>:    movl   0xfffffffc(%ebp),%eax
Run Code Online (Sandbox Code Playgroud)

作者表示我们想要跳过0x80004a8,0x80004b2并且这个跳转是8个字节; 作者如何确定这是8个字节?我重新创建了代码并发送了它objdump,发现它不是8个字节(我在64位机器上,但我确保使用32位编译):

8048452:    e8 b5 ff ff ff          call   804840c <function>
8048457:    c7 44 24 1c 01 00 00    movl   $0x1,0x1c(%esp)
804845e:    00 
804845f:    8b 44 24 1c             mov    0x1c(%esp),%eax
8048463:    89 44 24 04             mov    %eax,0x4(%esp)
8048467:    c7 04 24 18 85 04 08    movl   $0x8048518,(%esp)
Run Code Online (Sandbox Code Playgroud)

作者还说" 我们怎么知道在返回地址中添加8?我们首先使用测试值(例如1) "他在哪里使用此测试值?

Mic*_*ael 3

我不是这样解释这篇文章的。据我理解,他想修改返回地址,以便x = 1;跳过赋值,即他想function返回到printf将执行的位置。

正如您在反汇编中看到的,分配的是 8 个字节 ( c7 44 24 1c 01 00 00 00),因此将返回地址向前移动 8 个字节会将其移过该指令。至于“我们首先使用测试值”的评论..也许他只是意味着他在反汇编器中查看了代码以找出长度,或者他尝试了不同的偏移量(?)。