5

シェルコードを引数として渡したい小さなプログラムがあります。シェルコードでは、\x00を渡す必要があります。次のコマンドを試しました。

./program `python -c 'print "\x01\x00\x00\x00\x9c\xd8\xff\xbf"'`

しかし、\ x00はまったく登録されません!プログラムに渡される引数は「\x01\ x9c \ xff\xbf」です。

Pythonの問題ではなく、引数を渡すシェルの問題だと思います。私はbashシェルを使用しています。

では、シェルに引数'\ x00'を強制的に渡すにはどうすればよいですか?

よろしくお願い
いたします。HrishikeshMurali

4

6 に答える 6

2

全くない。Unixは、コマンドが呼び出される引数にCスタイルの文字列を使用し、それらはNULで終了する文字シーケンスです。

できることは、プログラムを書き直して(または呼び出しバリアントを見つけて)、標準入力のパラメーターを受け入れることです。NULバイトはそこでは問題なく機能し、実際、ファイル名に含めることができないのはNULバイトだけであるため、通常はファイル名の区切り文字として広く使用されています。ほぼ間違いなく最も人気のある例については、のスイッチとfindのスイッチを参照してください。-print0xarg-0

于 2011-09-06T07:35:12.450 に答える
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 に答える
1

--null オプションを指定した xargs コマンドが役立ちます。

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

私はそれを試しましたが、うまくいきました。

于 2015-07-31T06:43:23.037 に答える
0

これは、Bash が null 文字を破棄するためだと思います。

これをテストするためにod、次のスクリプトを使用して、コマンドを使用してパラメーターを 8 進数形式でダンプしました。

$ 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

null 文字は出力されません。

この問題を回避するには、16 進ダンプを渡し、プログラムでそれを逆にします。例:

$ 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

シェルコードをファイルに入れてから、それを読み戻して実行可能ファイルに渡すことができます。

何かのようなもの:

$ 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 コマンドラインをプログラムの引数として使用します

$ ./program $(perl -e ' $a = `cat shellcode.txt`; chomp($a); print $a x 10; ')
于 2011-09-08T17:05:21.653 に答える