所以我一直在研究一个简单的格式字符串漏洞,过去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
答案 0 :(得分:1)
第一个示例的问题是您的字符串包含大于0x7F的值。当Python输出字符串时,它决定(根据你的系统和语言设置)它应该写出UTF-8格式的字符。
UTF-8表示字符0x7F并且自身较低,因此A
和x4f
字符的写入不变。但是,UTF-8将值大于0x7F的字符表示为多个字节的序列。在这种情况下,大于0x7F的字符是\xcc
,\xd5
和\xff
。这些字符的UTF-8编码分别为0xC3 0x8C
,0xC3 0x95
和0xC3 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
方法。