2017-04-21 79 views
0

我想了解两个不同的行为,从Linux中的C程序(称为“weak_prog”)溢出,要求输入,以便让您溢出缓冲区。我明白,编译器会以特定的方式布局堆栈,有时会导致一些不可预测性。我无法理解的是,当我使用python脚本将20个字符添加到程序时,将缓冲区溢出时,处理内存的方式与手动运行vulnerable_prog并手动输入20个字符相反。C程序字符缓冲区意外溢出

示例程序声明了一个“char name [20]”的数组,并且目标是将其溢出并将特定值写入另一个将被覆盖的变量。 (这是来自经典的战争游戏网站)。

我知道处理器(64位)每次读取8个字节,所以这需要填充不是8的倍数的数组以保持内存的组织。因此,我的char [20]实际上占用了24个字节的内存,并可以作为8字节的字访问处理器。 的意外行为是这样的:

当使用Python脚本,溢出行为如下:

$python -c'print "A"*20 + "\xre\xhe\xyt\xhe"' | /path/vulnerable_prog 

的20个字符溢出缓冲器中,并且预期的值被写入到存储器中的正确的点。但是,当您尝试通过从命令提示符运行程序并手动输入20个字符,然后将所需的十六进制字符串写入内存来溢出缓冲区时,必须使用一个额外的十六进制字符才能拥有你的价值最终会在正确的地方,你想要的:

$echo$ 'AAAAAAAAAAAAAAAAAAAA\xre\xhe\xyt\xhe\xaf' 

凡(的“回声”,然后复制并粘贴到命令行中运行时vulnerable_prog提供提示输出)在脚本和命令行exploitati之间的字符数组的填充中做了这种差异发挥作用? 我一直在做很多C结构填充和ISO/IEC 9899:201x阅读的研究,但找不到任何可以解释这种细微差别的东西。 (这是我的第一个关于堆栈溢出的问题,所以我很抱歉,如果我没有正确地问这个问题)。

回答

0

你的Python脚本,当管道时,实际上发送了25个字符到/path/vulnerable_prog。 print语句添加一个换行符。这里是你的Python程序加上计数写到它的标准输入字符小Python脚本:

python -c'print "A"*20 + "\xre\xhe\xyt\xhe"' | python -c "import sys; print(len(sys.stdin.read()))" 

我猜你不粘贴是来自echo到程序的提示换行符。不幸的是,我认为我没有足够的信息来解释为什么你需要25个而不是24个角色来实现你想要的。

P.S.欢迎来到堆栈溢出!

+0

非常感谢。我很高兴你说你做了什么关于我没有粘贴来自echo输出的换行符。我只是再玩一遍,不小心复制+粘贴两种方式(带和不带换行符),并注意到其中的差异。这又向我指出了正确的方向,你的回答巩固了我的一切。这个挑战最近也被更新了,所以脚本方法似乎不再起作用,并且你必须手动利用它(否则我可能会提供更深入的了解为什么需要25个而不是24个) –