2

我正在尝试使用 python 编写一些汇编代码来重定向二进制流。这是给学校的。我相处得很好,但我被困住了,唉。我已经确定了我需要执行的汇编代码操作列表,问题出在 movl 调用中。我需要这个看起来像movl $0x0, add(%ebp)。我正在使用 python 将这些十六进制值存储在一个环境变量中,并计划跳转到该环境变量位置。所以,我做类似的事情

export CODE=`python -c 'print "somehex...\xc7\x45\xfc\x00\x00\x00\x00...morehex"'`

这很好地将它存储在 env 中,当我在 gdb 中跳转到它时,我可以 x/i 汇编代码。除了这个 movl 调用,一切看起来都很好。与其将 \x00 读取为参数(假定为 $0x0),不如将接下来的 4 个十六进制值作为源的参数。我找不到任何其他方式以我选择的 python 方式将 $0x0 写入 movl 的 src 参数。

任何帮助将不胜感激。已经为此工作了一段时间。

4

2 回答 2

4

环境变量是 C 字符串,它们不能保存\0字节。相反,您必须以不包含任何\0字节的方式编写 shellcode。您必须使用其他指令构造 0 值,例如sub, xor,或通过将现有的 0 值移动到所需的寄存器/内存位置。

顺便说一句,您可以简单地使用更短且更便携的/bin/echo -e 'somehex\x00\x00more'.

于 2012-09-14T07:18:21.367 回答
1

看起来有些东西正在剥离空字节。蟒蛇工作正常:

$ python -c 'print "somehex...\xc7\x45\xfc\x00\x00\x00\x00...morehex"' | hexdump
0000000 73 6f 6d 65 68 65 78 2e 2e 2e c7 45 fc 00 00 00
0000010 00 2e 2e 2e 6d 6f 72 65 68 65 78 0a            
000001c

但是将它写入一个环境变量并读回它,并且空值被剥离:

$ export CODE=`python -c 'print "somehex...\xc7\x45\xfc\x00\x00\x00\x00...morehex"'`
$ printenv CODE | hexdump
0000000 73 6f 6d 65 68 65 78 2e 2e 2e c7 45 fc 2e 2e 2e
0000010 6d 6f 72 65 68 65 78 0a                        
0000018
于 2012-09-14T07:27:18.553 回答