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