我正在尝试使用python写出一些汇编代码来重定向二进制流。这是为了学校。我相处得很好,但我被困了,唉。我确定了一个需要执行的汇编代码操作列表,麻烦在于movl调用。我需要这个看起来像movl $0x0, add(%ebp)
。我正在使用python将这些十六进制值存储在一个env变量中,并计划跳转到那个env变量位置。
所以,我做了类似
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参数的任何其他方法。
任何帮助都会非常感激。已经有一段时间了。
答案 0 :(得分:4)
环境变量是C字符串,那些不能保存\0
个字节。相反,您必须以某种方式编写shellcode,以使其不包含任何\0
个字节。您必须使用其他指令(例如sub
,xor
)或将现有的0值移动到所需的寄存器/内存位置来构造0个值。
顺便说一句,您可以使用更短且更便携的/bin/echo -e 'somehex\x00\x00more'
代替Python。
答案 1 :(得分:1)
看起来有些东西正在剥离空字节。 python运行正常:
$ 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