Python和Bash处理hex(shellcode)的方式有何不同?不一致?

时间:2018-06-02 11:05:28

标签: python bash hex shellcode format-string

所以我一直在研究一个简单的格式字符串漏洞,过去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

以下是 a b 文件的输出:

AAAAA���O
AAAAAÌÕÿO

1 个答案:

答案 0 :(得分: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方法。