5

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

4

6 回答 6

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
于 2012-03-21T11:06:53.173 回答
2

一点也不。Unix 使用 C 风格的字符串作为调用命令的参数,它们是 NUL 终止的字符序列。

您可以做的是重写您的程序(或找到调用变体)以接受其标准输入中的参数。NUL 字节在那里工作得很好,事实上,它被广泛使用,通常作为文件名的分隔符,因为它们几乎是文件名中唯一不能包含的东西。有关可以说是最流行的示例,请参见find's -print0switch 和xarg's switch 。-0

于 2011-09-06T07:35:12.450 回答
1

带有 --null 选项的 xargs 命令可以提供帮助:

python -c 'print "\x30\x00\x31"' | xargs --null ./program

我试过了,它奏效了。

于 2015-07-31T06:43:23.037 回答
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                                    

现在您看到打印了空字符。

于 2011-09-06T07:43:01.060 回答
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; ')
于 2011-09-08T17:05:21.653 回答
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字符。也许有人可以解释为什么会发生。

但是我们有其他技术可以避免在 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

于 2018-10-04T13:45:05.463 回答