了解 <getbuf> 的 assemble 代码的作用
Understand what the assemble code for <getbuf> does
问题一:
我正在阅读有关缓冲区溢出攻击的文章并看到了一些示例,但是我在掌握 assemble 代码级别上发生的事情时遇到了问题。有人可以帮我理解这段 assemble 代码吗?
问题二:
在这次攻击中,我们做了 24 个填充位,然后是目标地址,这里的地址被新的目标地址覆盖。
问题三:
我知道第一列是地址,但我很困惑第二列是什么,例如在第一行我们有 1 48 38 ec
虚拟代码:
<getbuf>
4019a1 48 38 ec sub [=12=]x18, 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 [=12=]x18, %rsp // not sure what's going on.
4019b4 48 83 c4 18 retq // return?
4019be c3 xchg %ax %ax // I thought we returned already
这不是实际代码,只是近似表示。
Can someone please help me understand this assemble code?
24 bit for buffer? but what's rsp?
rsp
是堆栈指针。堆栈是内存中的一些区域,用于函数的临时数据存储。在许多 CPU 上(包括 x86),call
指令还将在 ret
或 retq
指令之后执行的指令地址存储到堆栈中。
在 x86 CPUs 上,rsp
(32 位:esp
)寄存器包含一个地址。该地址之前的内存是空闲的,使用该地址和该地址之后的内存。
如果你需要100字节的临时内存,你从rsp
寄存器中减去100;这样做,表明您使用了这 100 字节的内存(由您的代码)。一旦不再需要内存,就恢复 rsp
.
的旧值
因为retq
假设rsp
指向call
存放地址的内存,所以在执行[=之前必须恢复rsp
的旧值13=].
not sure what does gets
do
gets
是用于 C 编程的函数。它读取一行文本(例如从键盘)。在您的情况下,该行被写入堆栈。与 fgets
不同,此函数将 不会 检查内存中是否有足够的 space!
如果读取的行长于 24 个字节,gets
函数将覆盖内存中在 sub [=27=]x18, %rsp
指令之前“使用”的数据。
正如我已经写过的那样,call
写入并由retq
读取的地址存储在那里!
也就是说:如果gets
读入的行太长,call
写入的地址会被覆盖,retq
指令不会return到调用函数,但它会跳转到内存中的某个错误地址。
(我希望这能回答问题 2。)
I thought we returned already
这里的xchg %ax %ax
并不是真正的指令,而只是一些虚拟数据。它被某些编译器插入,因为这些编译器总是生成长度为(例如)两个字节的倍数的函数。
but I am confused what's the second column for example in the 1st line we have 1 48 38 ec
这是 RAM 中代表第 3 列中的汇编程序指令的字节(十六进制表示法)。
示例:RAM 中的十六进制字节 48 38 ec
将被 CPU.
解释为 sub [=27=]x18, %rsp
(请注意tum_的评论:你的示例中显示的数据显然是错误的:48 38 ec
显然不是代表指令sub [=27=]x18, %rsp
的字节。)
问题一: 我正在阅读有关缓冲区溢出攻击的文章并看到了一些示例,但是我在掌握 assemble 代码级别上发生的事情时遇到了问题。有人可以帮我理解这段 assemble 代码吗?
问题二: 在这次攻击中,我们做了 24 个填充位,然后是目标地址,这里的地址被新的目标地址覆盖。
问题三: 我知道第一列是地址,但我很困惑第二列是什么,例如在第一行我们有 1 48 38 ec
虚拟代码:
<getbuf>
4019a1 48 38 ec sub [=12=]x18, 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 [=12=]x18, %rsp // not sure what's going on.
4019b4 48 83 c4 18 retq // return?
4019be c3 xchg %ax %ax // I thought we returned already
这不是实际代码,只是近似表示。
Can someone please help me understand this assemble code?
24 bit for buffer? but what's rsp?
rsp
是堆栈指针。堆栈是内存中的一些区域,用于函数的临时数据存储。在许多 CPU 上(包括 x86),call
指令还将在 ret
或 retq
指令之后执行的指令地址存储到堆栈中。
在 x86 CPUs 上,rsp
(32 位:esp
)寄存器包含一个地址。该地址之前的内存是空闲的,使用该地址和该地址之后的内存。
如果你需要100字节的临时内存,你从rsp
寄存器中减去100;这样做,表明您使用了这 100 字节的内存(由您的代码)。一旦不再需要内存,就恢复 rsp
.
因为retq
假设rsp
指向call
存放地址的内存,所以在执行[=之前必须恢复rsp
的旧值13=].
not sure what does
gets
do
gets
是用于 C 编程的函数。它读取一行文本(例如从键盘)。在您的情况下,该行被写入堆栈。与 fgets
不同,此函数将 不会 检查内存中是否有足够的 space!
如果读取的行长于 24 个字节,gets
函数将覆盖内存中在 sub [=27=]x18, %rsp
指令之前“使用”的数据。
正如我已经写过的那样,call
写入并由retq
读取的地址存储在那里!
也就是说:如果gets
读入的行太长,call
写入的地址会被覆盖,retq
指令不会return到调用函数,但它会跳转到内存中的某个错误地址。
(我希望这能回答问题 2。)
I thought we returned already
这里的xchg %ax %ax
并不是真正的指令,而只是一些虚拟数据。它被某些编译器插入,因为这些编译器总是生成长度为(例如)两个字节的倍数的函数。
but I am confused what's the second column for example in the 1st line we have 1 48 38 ec
这是 RAM 中代表第 3 列中的汇编程序指令的字节(十六进制表示法)。
示例:RAM 中的十六进制字节 48 38 ec
将被 CPU.
sub [=27=]x18, %rsp
(请注意tum_的评论:你的示例中显示的数据显然是错误的:48 38 ec
显然不是代表指令sub [=27=]x18, %rsp
的字节。)