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) "他在哪里使用此测试值?
我不是这样解释这篇文章的。据我理解,他想修改返回地址,以便x = 1;跳过赋值,即他想function返回到printf将执行的位置。
正如您在反汇编中看到的,分配的是 8 个字节 ( c7 44 24 1c 01 00 00 00),因此将返回地址向前移动 8 个字节会将其移过该指令。至于“我们首先使用测试值”的评论..也许他只是意味着他在反汇编器中查看了代码以找出长度,或者他尝试了不同的偏移量(?)。
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |