【问题标题】:C program char buffer unexpected overflowC 程序字符缓冲区意外溢出
【发布时间】: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


    【解决方案1】:

    您的 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!

    【讨论】:

    • 非常感谢。我很高兴你说了你对我没有粘贴来自 echo 输出的换行符所做的事情。我只是再次玩弄这个并且不小心复制+粘贴了两种方式(有和没有换行符)并注意到了差异。这为我指明了正确的方向,您的回答为我巩固了一切。该挑战最近也已更新,因此脚本方法似乎不再有效,您必须手动利用它:)(否则我可能能够提供更多关于为什么需要 25 而不是 24 的见解)
    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2021-12-10
    • 2012-02-05
    • 1970-01-01
    • 2017-06-26
    • 2022-11-30
    • 2019-04-17
    • 2013-04-12
    相关资源
    最近更新 更多