文章可以在这里找到。
我正在阅读有关粉碎堆栈的内容,并发现自己被困在 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
作者表示我们要从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)
作者还说“我们怎么知道返回地址要加8?我们先用了一个测试值(比如1) ”他在哪里使用这个测试值呢?