【问题标题】:Python and Bash handle hex (shellcode) differently? Inconsistent?Python 和 Bash 以不同方式处理十六进制(shellcode)?不一致?
【发布时间】:2018-06-02 11:05:28
【问题描述】:

所以我一直在研究一个简单的格式字符串漏洞,在过去 3 个小时左右的时间里,我一直在敲桌子,想知道为什么我的十六进制值没有出现在堆栈上。

如果有人能启发我,我将不胜感激。


1.

最初我在进行这些挑战时使用 python 编写脚本,特别是对于这个示例:

python -c 'print "AAAAA\xcc\xd5\xff\x4f"' > a

随后在 GDB 中查看堆栈:

    format string> 
    0xffffd550: 0xffffd584  0xf7ffdab8  0x41f95300  0x41414141
    0xffffd560: 0x95c38cc3  0x0a4fbfc3  0xf7e2ec00  0xf7f8f820

现在看起来它没有出现在“AAAAA”之后(因为未对齐,所以使用了 5)。


2.

但是,当我使用以前使用过的另一个地址时:

python -c 'print "AAAAA\x5c\x57\x55\x56"' > a

我明白了:

    format string> 
    0xffffd550: 0xffffd584  0xf7ffdab8  0x41f95300  0x41414141
    0xffffd560: 0x5655575c  0x0000000a  0xf7e2ec69  0xf7f8f820

而且看起来完全没问题?


3.

另外,当我使用类似的东西时:

echo -en "AAAAA\xcc\xd5\xff\x4f" > b

我能够正确地将值设置到堆栈中:

format string> 
0xffffd550: 0xffffd584  0xf7ffdab8  0x41f95300  0x41414141
0xffffd560: 0x4fffd5cc  0x00000000  0xf7e2ec69  0xf7f8f820

下面分别是ab文件的输出:

AAAAA���O
AAAAAÌÕÿO

【问题讨论】:

  • bash 使用 8 位字符串,python 使用 16、32 或 8 位字符串,具体取决于上下文和 python 版本,
  • 我看不到a 将如何包含任何内容,因为您没有有效的 Python 脚本。
  • 哦,糟糕,已编辑。我没有正确复制粘贴它

标签: python bash hex shellcode format-string


【解决方案1】:

第一个示例的问题是您的字符串包含大于 0x7F 的值。当 Python 输出字符串时,它决定(基于您的系统和语言设置)它应该以 UTF-8 格式写出字符。

UTF-8 将 0x7F 及以下的字符表示为自身,因此 Ax4f 字符被原样写出。但是,UTF-8 将值大于 0x7F 的字符表示为多字节序列。在这种情况下,大于 0x7F 的字符是 \xcc\xd5\xff。这些字符的 UTF-8 编码分别为 0xC3 0x8C0xC3 0x950xC3 BF。这些是内存转储中显示的值。

您可以通过强制 Python 使用处理高于 0x7F 的值的编码发出字符串来解决这个问题,方法是将它们作为本身传递,而不进行转换。 “latin1”就是这样一种编码,所以你可以使用这个命令:

python 'print u"AAAAA\xcc\xd5\xff\x4f".encode("latin1")'

但这很丑。

另外,Python 版本总是在字符串末尾发出一个换行符 (0x0A)。它显示在您打算提供的值之后的单词中的内存转储中。你可以通过写来解决这个问题:

python -c 'import sys; sys.stdout.write(u"AAAAA\xcc\xd5\xff\x4f".encode("latin1"))'

但这更难看。

我会忘记尝试为此使用 Python 单线器并坚持使用 echo -ne 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2015-12-08
    • 1970-01-01
    • 2020-09-25
    • 2020-05-14
    • 2012-10-02
    • 2011-07-07
    相关资源
    最近更新 更多