c - 确定进行缓冲区溢出攻击所需的额外字节数(作业)

标签 c assembly buffer-overflow

协助完成 this buffer overflow project (.pdf) 的第 0 级在汇编中,我使用 this guide .

Goal = provide a string longer than getbuf can handle (getbuf() takes an input of 32 characters), causing an overflow and pushing the rest of the string onto the stack where you can then control where the function getbuf returns after exection (we want to call the smoke() function).

当我到达指南的第 2 步时,我需要计算我的输入字符串在原始 32 个字符输入之上应该有多少个额外字符,以便执行缓冲区溢出并调用 smoke( )

(第 2 步摘录):

enter image description here

在我的例子中,我发现 startingAddressOfBufVariable0x55683ddc%ebp0x55683df0

我计算了 buffer size = addressAt%ebp+4 - startingAddressOfBufVariable,即 0x55683df0+4 - 0x55683ddc = 0x18 = 24

在下一步中,我应该从该结果中减去 32,以确定我的输入字符串应该有多少个额外的字符(在原来的 32 个字符之上)。但是,24 - 32 = -8。我得到一个负数!我不知道该怎么办。 从 32 个字符的输入字符串中减去 8 个字符?我正在尝试进行溢出,所以这没有意义。

enter image description here

出于测试/猜测的目的,我继续阅读指南,假装我得到的 -8 结果实际上是正 8。所以我继续使用指南,打算在我的 32 个字符的字符串之上添加 8 个字符。

知道我的 smoke() 函数的地址是 0x08048b2b,我按照步骤 4 中的说明创建了我的输入文件(尽管它们为什么改变了aa61?):

perl -e 'print "AA "x32, "BB "x4, "CC "x4, "2b 8b 04 08" '>hex3

(第 4 步摘录:) enter image description here

那么,我是否在指南的第 2 步中使用了不正确的数学?我在数学中使用的地址不正确吗?如果它们是正确的,我如何解释 -8 结果,以及 -8 结果是什么意思,就修改我的字符输入以执行溢出攻击而言?

最佳答案

他们在示例 C 代码中写入缓冲区大小为 12。您必须从寄存器中推断缓冲区大小是有道理的。也许用 0x18 的基本字符串大小再试一次?

关于c - 确定进行缓冲区溢出攻击所需的额外字节数(作业),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48920223/

相关文章:

c - printf() 和格式说明符链接

assembly - x86 AT&T 语法汇编的注释语法

C:关于struct中二维数组的初学者问题

无法将文件名分配给vim中的环境变量

linux nasm 将 AL 中的值移动到 AX

c - 可执行文件的大小?

c - 写一个 return-to-libc 攻击,但是 libc 被加载到内存中的 0x00

c - 缓冲区溢出/溢出解释?

c - 不溢出的缓冲区溢出

c++ -++c 和 c++ 增量何时应用在这里?