如何将\ x00作为参数传递给程序?

时间:2011-09-06 07:17:15

标签: shell command-line shellcode

我有一个小程序,我希望将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

6 个答案:

答案 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