【发布时间】:2023-03-25 17:46:02
【问题描述】:
我试图了解 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”的输出复制并粘贴到从命令行运行时脆弱_prog 提供的提示符中)
脚本和命令行开发之间的字符数组填充的差异在哪里起作用? 我在ISO/IEC 9899:201x 中对 C 结构填充和阅读进行了大量研究,但找不到任何可以解释这种细微差别的东西。 (这是我在 Stack Overflow 上的第一个问题,所以如果我没有完全正确地问这个问题,我深表歉意。)
【问题讨论】:
标签: python c linux buffer-overflow