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 문자열은 다음과 같기 때문에 확장 시 널 바이트를 허용하지 않습니다.종료널 바이트를 전달하십시오.

$ 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어느 것으로 전환합니까?하다문자열에는 Null 바이트가 허용됩니다.

$ 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

관련 정보