Python C程序字符缓冲区意外溢出
我试图理解Linux中请求输入的C程序(称为vulnerable_prog)溢出的两种不同行为,以便允许缓冲区溢出。我知道编译器以特定的方式布置堆栈框架,有时会造成一些不可预测性。我无法理解的是,当我使用python脚本将20个字符输入到程序时,缓冲区溢出,而不是手动运行vulnerable_prog并手动输入20个字符时,内存处理方式的不同 示例程序声明了一个“char name[20]”数组,目标是使其溢出,并将特定值写入将被覆盖的另一个变量。(这是一个经典的战争游戏网站) 据我所知,处理器(64位)一次读取8个字节,因此需要填充不是8的倍数的数组,以保持内存有序。因此,我的char[20]实际上占用了24字节的内存,处理器可以将其作为8字节的字访问。 意外行为如下所示: 使用python脚本时,溢出行为如下所示:Python C程序字符缓冲区意外溢出,python,c,linux,buffer-overflow,Python,C,Linux,Buffer Overflow,我试图理解Linux中请求输入的C程序(称为vulnerable_prog)溢出的两种不同行为,以便允许缓冲区溢出。我知道编译器以特定的方式布置堆栈框架,有时会造成一些不可预测性。我无法理解的是,当我使用python脚本将20个字符输入到程序时,缓冲区溢出,而不是手动运行vulnerable_prog并手动输入20个字符时,内存处理方式的不同 示例程序声明了一个“char name[20]”数组,目标是使其溢出,并将特定值写入将被覆盖的另一个变量。(这是一个经典的战争游戏网站) 据我所知,处理器
$python -c'print "A"*20 + "\xre\xhe\xyt\xhe"' | /path/vulnerable_prog
20个字符溢出缓冲区,预期值写入内存中的正确位置
但是,当您试图通过从命令提示符运行程序并手动输入20个字符,然后输入要写入内存的所需十六进制字符串来溢出缓冲区时,您必须使用一个额外的十六进制字符,以使您的值最终位于所需的正确位置:
$echo$ 'AAAAAAAAAAAAAAAAAAAA\xre\xhe\xyt\xhe\xaf'
(然后将“echo”的输出复制并粘贴到从命令行运行时vulnerable_prog提供的提示中)
脚本和命令行之间的字符数组填充差异在哪里发挥作用?
我已经做了很多关于C结构填充和阅读的研究,但是找不到任何可以解释这种细微差别的东西。
(这是我关于堆栈溢出的第一个问题,如果我问得不太正确,我很抱歉。)您的Python脚本在管道中实际发送了25个字符到
/path/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个字符来实现你的目标
另外,欢迎来到Stack Overflow 多谢各位。我很高兴你说了关于我没有粘贴来自echo输出的换行符的事情。我只是在玩这一次,不小心复制+粘贴两种方式(有和没有换行符),并注意到了差异。这为我指明了一个更正确的方向,你的回答为我巩固了一切。这个挑战最近也进行了更新,因此脚本方法似乎不再有效,您必须手动利用它:)(否则,我可能能够提供更多关于为什么需要25而不是24的见解)