gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:59 26 4
gpt4 key购买 nike

我试图了解 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 结构填充和阅读 ISO/IEC 9899:201x ,但找不到任何可以解释这种细微差别的东西。(这是我在 Stack Overflow 上的第一个问题,所以如果我问得不正确,我深表歉意。)

最佳答案

您的 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 个字符来实现您的尝试。

附言欢迎来到 Stack Overflow!

关于python - C程序字符缓冲区意外溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43545898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com