c - 粉碎栈example3.c困惑

标签 c stack-overflow buffer-overflow disassembly

文章可查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/

相关文章:

serial-port - 串口打印机缓冲区溢出

c - 如何调度进程

c - 如何将输入的电话号码存储到 int 数组中? C

c - 处理一个空的 'else if'

haskell - 关于折叠和堆栈溢出的问题

c - 预期的缓冲区溢出并不总是导致程序崩溃

c - 为什么gets 函数如此危险以至于不应该使用它?

c - 释放字符指针会返回错误

c - MATLAB 在 DLL 中调用函数时的堆栈限制是多少

检测到 c 堆栈粉碎