理解 <getbuf> 的汇编代码做了什么

用户11010081

问题 1:我正在阅读有关缓冲区溢出攻击的文章并看到了一些示例,但是我在掌握汇编代码级别的情况时遇到了问题。有人可以帮我理解这个汇编代码吗?

问题 2:在这次攻击中,我们做了 24 个填充位,然后是目标地址,这里的地址被新的目标地址覆盖。

问题 3:我知道第一列是地址,但我很困惑第二列是什么,例如在第一行我们有 1 48 38 ec

虚拟代码:

<getbuf>
4019a1   48 38 ec     sub $0x18, rsp    // 24 bit for buffer? but what's rsp?
4019a8   48 38 ec 18  mov %rsp, %rdi    // rdi == arg, but what's rsp?
4019ac   48 89 e7     call <gets>       // not sure what does <gets> do
4019af   e8 8c 02 00  add  $0x18, %rsp  // not sure what's going on.
4019b4   48 83 c4 18  retq              // return?
4019be   c3           xchg %ax %ax      // I thought we returned already

这不是实际的代码,而只是一个接近的表示。

马丁·罗森瑙

有人可以帮我理解这个汇编代码吗?

24 位缓冲区?但什么是rsp?

rsp是堆栈指针。堆栈是内存中用于函数临时存储数据的一些区域。在许多 CPU(包括 x86)上,该call指令还将在retorretq指令之后执行的指令的地址存储到堆栈中。

在 x86 CPU 上,rsp(32 位:)esp寄存器包含一个地址。该地址之前的内存是空闲的,该地址和该地址之后的内存被使用。

如果需要 100 字节的临时内存,则从rsp寄存器中减去 100 这样做,您表示使用了这 100 个字节的内存(由您的代码)。一旦不再需要内存,就会恢复 的旧值rsp

因为retq假设rsp指向call存储地址的内存,你必须rsp在执行之前恢复 的旧值retq

不知道做gets什么

gets是一个用于 C 编程的函数。它读取一行文本(例如从键盘)。在您的情况下,该行被写入堆栈。不像fgets这个函数不会检查内存是否有足够的空间!

如果读取的行长度超过 24 个字节,该gets函数将覆盖在sub $0x18, %rsp指令之前“使用”的内存中的数据

正如我已经写过的,写入call和读取的地址retq存储在那里!

换句话说:如果读入的行gets太长,写的地址call被覆盖,retq指令不会返回调用函数,而是跳转到内存中的某个错误地址。

(我希望这能回答问题 2。)

我以为我们已经回来了

这里xchg %ax %ax并不是真正的指令,而只是一些虚拟数据。它由一些编译器插入,因为这些编译器总是生成(例如)两个字节长的倍数的函数。

但我很困惑第二列是什么,例如在第一行我们有 1 48 38 ec

这是 RAM 中代表第 3 列中的汇编器指令的字节(以十六进制表示法)。

示例:48 38 ecRAM 中的十六进制字节将被sub $0x18, %rspCPU解释为

(另请注意 tum_ 的评论:您示例中显示的数据显然是错误的:48 38 ec显然不是表示指令的字节sub $0x18, %rsp。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章