文章可查here .
我正在阅读有关 smashing the stack 的内容,发现自己卡在了 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)”他把这个测试值用在什么地方了?
最佳答案
这不是我解读这篇文章的方式。按照我的理解,他想修改返回地址,以便跳过 x = 1;
赋值,即他希望 function
返回到 printf 的位置
将被执行。
正如您在反汇编中看到的那样,赋值是 8 个字节 (c7 44 24 1c 01 00 00 00
),因此将返回地址向前移动 8 个字节会将其移过该指令。至于“我们首先使用了测试值”的评论……也许他只是意味着他在反汇编程序中查看了代码以计算出长度,或者他尝试了不同的偏移量(?)。
关于c - 粉碎栈example3.c困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13006327/