【发布时间】:2012-10-11 23:04:36
【问题描述】:
文章可以在here找到。
我正在阅读有关粉碎堆栈的内容,并发现自己被困在 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)" 他在哪里使用了这个测试值?
【问题讨论】:
-
根据用户请求移至 StackOverflow。 (+1,好问题。)
-
如果你像那篇文章中那样减去地址,你会得到 10 个字节 :) 检查我答案末尾的链接,偏移量是错误的。
-
有回答说现在已经修改了。这是最新的revision
标签: c stack-overflow buffer-overflow disassembly