了解汇编代码的含义 不

问题描述 投票:0回答:1

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

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

问题3:我知道第一列是针对地址的,但我很困惑第一列是什么,例如我们在第1行有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

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

assembly buffer overflow
1个回答
0
投票

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

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

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

在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列中的汇编程序指令。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.