Bash

在 unix 管道中發送空字節

  • June 4, 2020

我正在嘗試將 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

如何在輸入中允許空字節?

您可以通過管道傳遞空字節(就像您在標題中所說的那樣),但bash外殼程序不允許在擴展中使用空字節。它不允許在擴展中使用空字節,因為 shell 使用 C 字元串來表示擴展的結果,並且 C 字元串以空字節終止

$ 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

因此,解決方案是避免讓 shell 將包含空字節的數據儲存在字元串中,而是通過管道傳遞數據,而不使用命令替換。在你的情況下

$ 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

引用自:https://unix.stackexchange.com/questions/590682