【发布时间】:2018-02-22 05:26:25
【问题描述】:
为了帮助在 Assembly 中完成 this buffer overflow project (.pdf) 的第 0 级,我使用的是 this guide。
目标 = 提供比 getbuf 可以处理的更长的字符串(
getbuf()需要 32 个字符的输入),导致溢出并推动其余部分 将字符串放到堆栈中,然后您可以控制 函数getbuf执行后返回(我们要调用smoke()函数)。
当我进入指南的第 2 步时,我需要计算我的输入字符串在原始 32 字符输入之上应该有多少额外字符,以便执行缓冲区溢出并调用 smoke()。
(第 2 步摘录):
在我的例子中,我发现startingAddressOfBufVariable 是0x55683ddc 而%ebp 是0x55683df0。
我计算buffer size = addressAt%ebp+4 - startingAddressOfBufVariable,即0x55683df0+4 - 0x55683ddc = 0x18 = 24。
在下一步中,我应该从该结果中减去 32,以确定我的输入字符串应该有多少额外的字符(在原来的 32 之上)。但是,24 - 32 = -8。我得到一个负数!我不知道该怎么办。 从我的 32 个字符的输入字符串中减去 8 个字符?我正在尝试进行溢出,所以这没有意义。
出于测试/猜测的目的,我继续使用指南,假装我得到的-8 结果实际上是一个肯定的8。所以我继续使用指南,打算在我的 32 个字符的字符串之上添加 8 个字符。
知道我的smoke() 函数的地址是0x08048b2b,我按照步骤4 中的说明创建了我的输入文件(尽管他们为什么将aa 更改为61?):
perl -e 'print "AA "x32, "BB "x4, "CC "x4, "2b 8b 04 08" '>hex3
那么,我是否在指南的第 2 步中使用了不正确的数学?我在数学中使用的地址是否不正确?如果它们是正确的,我如何解释-8 结果,-8 结果是什么意思,在修改我的字符输入以执行溢出攻击方面?
【问题讨论】:
-
您是否在检查第 2 步中的值之前先进入
getbuf?我怀疑您在此之前就这样做了,这就是为什么ebp稍微偏离了。 -
'a' == 0x61在 ASCII 编码中,以及许多其他现代字符串编码,如 UTF8 或 Windows 的几乎所有拉丁字母编码保持低 0-127 值兼容。但这意味着61是"a",而不是"aa"。"aa"是0x6161(两个字节)。 (就像'A'是0x41...检查任何ASCII表,看看大多数英文文本是如何在计算机中从字母编码成数字的,因为计算机根本不知道任何字母) -
阅读更多这些图片,看起来作者的想法有些冲突,有时使用 ASCII 码 0x41/0x61 的字符如 a/A 来获得堆栈内存的“a/A”填充,有时他们只是使用像 0xAA 这样的十六进制值来填充内存(通常在 UTF8 linux 调试器中显示为点“。”,因为它不是有效的 7 位 ASCII 代码,并且像内存区域一样显示单字节对编写代码没有意义 -以 UTF8 方式指向,其中几个字节可能只形成一个字母)。取决于您如何检查内存,您当前显示双字值 0xAA、0xBB、0xCC 的方式可能更“可见”。
-
如果您将该内存显示为“字符串”(许多调试器提供两个窗格的内存视图,通常左侧是数值,右侧是这些值的 ASCII“字符串”解释),那么像 0x61, 0x62, 0x63, ... 这样的值会在 ASCII 解释的窗格中产生字母 a, b, c, ...(使填充更“可见”)。
标签: c assembly buffer-overflow