我有一个小程序,我希望将shellcode作为参数传递。在shellcode中,有必要传递\ x00。我尝试了以下命令:
./program `python -c 'print "\x01\x00\x00\x00\x9c\xd8\xff\xbf"'`
但\ x00根本没有注册!传递给程序的参数是“\ x01 \ x9c \ xff \ xbf”。
我认为这不是python的问题,而是传递参数的shell。我正在使用bash shell。
现在,如何强制shell传递参数'\ x00'?
谢谢和问候,
Hrishikesh Murali
答案 0 :(得分:2)
如果您与wc
核实,您会发现确实传递了NUL字符:
$ python -c 'print "\x00"' | wc -c
2
最后摆脱换行符:
$ python -c 'import sys; sys.stdout.write("\x00")' | wc -c
1
此数据 传递给脚本,但问题是 NUL不能是变量值的一部分。
要了解如何,请尝试将其传递给脚本:
$ cat test.sh
#!/usr/bin/env bash
echo ${#1}
$ ./test.sh "$(python -c 'import sys; sys.stdout.write("\x00")')"
0
不见了。但是有一种方法可以节省时间 - 使用重定向或管道从标准输入读取:
$ cat test2.sh
#!/usr/bin/env bash
wc -c
$ ./test2.sh < <(python -c 'import sys; sys.stdout.write("\x00")')
1
$ python -c 'import sys; sys.stdout.write("\x00")' | ./test2.sh
1
答案 1 :(得分:1)
完全没有。 Unix使用C风格的字符串作为调用命令的参数,它们是以NUL结尾的字符序列。
您可以做的是重写程序(或查找调用变量)以接受其标准输入中的参数。 NUL字节在那里工作得很好,事实上,它们被广泛使用,通常作为文件名的分隔符,因为它们几乎是文件名永远不能包含的唯一东西。有关最受欢迎的示例,请参阅find
的{{1}}切换和-print0
的切换xarg
。
答案 2 :(得分:1)
带有--null选项的xargs命令可以提供帮助:
python -c 'print "\x30\x00\x31"' | xargs --null ./program
我试过了,但它确实有效。
答案 3 :(得分:0)
我相信这是因为Bash丢弃了空字符。
为了测试这个,我使用od
命令以八进制格式转储参数,使用以下脚本:
$ cat script.sh
#!/bin/bash
echo "$@" | od -c
并使用以下方式运行:
$ script.sh `python -c 'print "\x01\x00\x00\x00\x9c\xd8\xff\xbf"'`
0000000 001 234 330 377 277 \n
0000006
不会打印空字符。
要解决此问题,请在 hexdump 中传递,然后在程序中将其反转。例如:
$ cat script.sh
#!/bin/bash
echo "$@" | xxd -r -p | od -c
$ script.sh `python -c 'print "\x01\x00\x00\x00\x9c\xd8\xff\xbf"' | xxd -p`
0000000 001 \0 \0 \0 234 330 377 277 \n
0000011
现在您看到打印了空字符。
答案 4 :(得分:0)
您可以尝试将shellcode放入文件中,然后将其读回并将其传递给可执行文件。
类似的东西:
$ cat shellcode.txt
\xb5\x06\x40\x00\x00\x00\x00\x00
$ perl -e ' $a = `cat shellcode.txt`; chomp($a); print $a x 10; '
\xb5\x06\x40\x00\x00\x00\x00\x00\xb5\x06\x40\x00\x00\x00\x00\x00\xb5\x06\x40\x00
\x00\x00\x00\x00\xb5\x06\x40\x00\x00\x00\x00\x00\xb5\x06\x40\x00\x00\x00\x00\x00
\xb5\x06\x40\x00\x00\x00\x00\x00\xb5\x06\x40\x00\x00\x00\x00\x00\xb5\x06\x40\x00
\x00\x00\x00\x00\xb5\x06\x40\x00\x00\x00\x00\x00\xb5\x06\x40\x00\x00\x00\x00\x00
使用上面的perl cmdline作为程序的参数
$ ./program $(perl -e ' $a = `cat shellcode.txt`; chomp($a); print $a x 10; ')
答案 5 :(得分:0)
您可以尝试一下,
main.out `perl -e 'print "xxxxssssdd\x23\x00\xaf"'`
和
perl -e 'print "xxxxssssdd\x23\x00\xaf"' | wc -c
13
证明已通过\ x00。
顺便说一句,我在测试中发现c程序肯定在argv中提示\ 00。您可以检查argv,例如
x /8sb 0x7fffffffe46a
0x7fffffffe46a: "/home/victor/Documents/CDemo/overflow/shellcode2/shellcode_host.out"
0x7fffffffe4ae: '\220' <repeats 21 times>, "\353#YUH\211\345@\200\354\200H\211M\220H1\300H\211E\230H\211\302H\215u\220H\213}\220\260;\017\005\350\330\377\377\377/bin/sh\200\337\377\377\377\177"
0x7fffffffe4fb: "LC_PAPER=zh_CN.UTF-8"
所以我猜想shell或c程序可以自动提示\ x00 chararcter。也许有人可以解释它发生的原因。
但是我们还有其他技术可以避免在shellcode中使用\ x00。
mov $59, %al # not %rax
sub $0x80, %spl # not %rsp
xorq %rax, %rax # construct 0 value with rax
您可以参考该文章。 https://www.exploit-db.com/docs/english/13019-shell-code-for-beginners.pdf