Unixパイプからヌルバイトを送信する

Unixパイプからヌルバイトを送信する

Pythonで生成された入力をbash 5.0.3のELF 64ビット実行可能ファイルにリダイレクトしようとしています。入る予定です(状態:

> ./bf <<< $(python2 -c "print('c'*6+b'\x00'+'c'*6)")
bash: warning: command substitution: ignored null byte in input
Enter password: Password didn't match
input: cccccccccccc

入力にnullバイトを許可する方法は?

答え1

タイトルのようにヌルバイトをパイプできますが、シェルはbash拡張でヌルバイトを許可しません。シェルは拡張結果を表すためにC文字列を使用し、C文字列は次のようになるため、拡張時にNULLバイトを許可しません。終了ヌルバイトを渡します。

$ hexdump -C <<< $( python2 -c "print('c'*6+b'\x00'+'c'*6)" )
bash: warning: command substitution: ignored null byte in input
00000000  63 63 63 63 63 63 63 63  63 63 63 63 0a           |cccccccccccc.|
0000000d

パイプを介してデータを渡すことはうまく機能します。

$ python2 -c "print('c'*6+b'\x00'+'c'*6)" | hexdump -C
00000000  63 63 63 63 63 63 00 63  63 63 63 63 63 0a        |cccccc.cccccc.|
0000000e

プロセス置換はコマンドによって生成されたデータに拡張されず、ファイル名に拡張されるため、プロセス置換リダイレクトも機能します。含むこのデータは:

$ hexdump -C < <( python2 -c "print('c'*6+b'\x00'+'c'*6)" )
00000000  63 63 63 63 63 63 00 63  63 63 63 63 63 0a        |cccccc.cccccc.|
0000000e

したがって、解決策は、文字列にnullバイトを含むデータをシェルに格納せず、代わりにコマンド置換を使用せずにデータをパイプ処理することです。あなたの場合

$ python2 -c "print('c'*6+b'\x00'+'c'*6)" | ./bf

関連:


それともzshどちらに切り替えますか?する文字列にはヌルバイトが許可されます。

$ hexdump -C <<< $( python2 -c "print('c'*6+b'\x00'+'c'*6)" )
00000000  63 63 63 63 63 63 00 63  63 63 63 63 63 0a        |cccccc.cccccc.|
0000000e

関連情報