繁体   English   中英

C程序char缓冲区意外溢出

[英]C program char buffer unexpected overflow

我试图从Linux中的C程序(称为脆弱性_程序)中了解两种不同的溢出行为,该行为要求输入,以便允许您溢出缓冲区。 我了解编译器会以特定方式对堆栈框架进行布局,有时会导致一些不可预测性。 我不明白的是,当我使用python脚本溢出缓冲区以向程序提供20个字符时,处理内存的方式有所不同,这与手动运行弱势_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'的输出复制并粘贴到从命令行运行时,unable_prog提供的提示中)

脚本和命令行利用之间的字符数组填充差异在哪里发挥作用? 我一直在研究C结构填充和在ISO / IEC 9899:201x中进行阅读 ,但是找不到任何可以解释这种细微差别的内容。 (这是我关于堆栈溢出的第一个问题,因此,如果我不太正确地提出这个问题,我深表歉意。)

您的Python脚本通过管道传输后,实际上会将25个字符发送到/path/vulnerable_prog 打印语句添加换行符。 这是您的Python程序以及一个小的Python脚本,该脚本计算写入标准输入中的字符:

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

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

PS欢迎使用堆栈溢出!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM