Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python C程序字符缓冲区意外溢出_Python_C_Linux_Buffer Overflow - Fatal编程技术网

Python C程序字符缓冲区意外溢出

Python C程序字符缓冲区意外溢出,python,c,linux,buffer-overflow,Python,C,Linux,Buffer Overflow,我试图理解Linux中请求输入的C程序(称为vulnerable_prog)溢出的两种不同行为,以便允许缓冲区溢出。我知道编译器以特定的方式布置堆栈框架,有时会造成一些不可预测性。我无法理解的是,当我使用python脚本将20个字符输入到程序时,缓冲区溢出,而不是手动运行vulnerable_prog并手动输入20个字符时,内存处理方式的不同 示例程序声明了一个“char name[20]”数组,目标是使其溢出,并将特定值写入将被覆盖的另一个变量。(这是一个经典的战争游戏网站) 据我所知,处理器

我试图理解Linux中请求输入的C程序(称为vulnerable_prog)溢出的两种不同行为,以便允许缓冲区溢出。我知道编译器以特定的方式布置堆栈框架,有时会造成一些不可预测性。我无法理解的是,当我使用python脚本将20个字符输入到程序时,缓冲区溢出,而不是手动运行vulnerable_prog并手动输入20个字符时,内存处理方式的不同

示例程序声明了一个“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'
(然后将“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的见解)