2017-10-22 13 views
11

버퍼 오버플로 문제로 작업하면서 뭔가 이상한 점을 발견했습니다. 성공적으로 점프하고 싶은 적절한 주소 앞에 32자를 제공해야하며 적절한 주소는 0x08048a37이라는 것을 성공적으로 발견했습니다. 실행했을 때Python3 print() Vs Python2 print

python -c "print '-'*32+'\x37\x8a\x04\x08'" | ./MyExecutable 

악용으로 성공을 거두었습니다. 하지만, 내가 시도했을 때 :

python3 -c "print('-'*32+'\x37\x8a\x04\x08')" | ./MyExecutable 

그것은하지 않았다. 실행 파일은 원하는 주소로 점프하지 않고 단순히 세그먼트 화 오류를 발생 시켰습니다. 사실, 콘솔 개의 상이한 출력

python -c "print '-'*32+'\x37\x8a\x04\x08'" 

python3 -c "print('-'*32+'\x37\x8a\x04\x08')" 

결과를 실행하는 단계를 포함한다. 문자는 물론 읽을 수 없지만 시각적으로 다릅니다.

왜 이런 일이 발생했는지 궁금합니다.

답변

19

파이썬 2 코드는 바이트이며, 파이썬 3 코드는 텍스트으로 작성되고 바이트로 인코딩됩니다. 따라서 후자는 동일한 출력을 작성하지 않습니다. 그것은 귀하의 파이프에 구성된 코덱에 따라 다릅니다.

파이썬 3에서, 대신 sys.stdout.buffer 개체에 바이트 쓰기 :

python3 -c "import sys; sys.stdout.buffer.write(b'-'*32+b'\x37\x8a\x04\x08')" 

당신은 수동으로 print 추가 것이라는 \n 줄 바꿈을 추가 할 수 있습니다.

sys.stdoutio.TextIOBase object입니다.이 코드는 기본 버퍼 객체에 전달하기 전에 특정 코덱 (일반적으로 로캘을 기반으로하지만 파이프를 사용하는 경우 ASCII로 지정되는 경우가 있음)으로 인코딩됩니다. TextIOBase.buffer attribute을 사용하면 기본 BufferedIOBase object에 직접 액세스 할 수 있습니다.