본문 바로가기

wargame/hackCTF

[hackCTF]pwnable 내 버퍼가 흘러넘친다!!

내 버퍼가 흘러넘친다!!


4번 문제


이전과 같이 문제를 다운 받고 실행 권한을 준다.


마찬가지로 아이다로 확인해보자.

main함수 외에는 기본적으로 주어진 함수이다. main 함수 내에서 문제를 해결해야 한다.
setvbuf(stdout, 0, 2, 0); 은 버퍼를 없앤다고 한다. 자세한 건 구글링ㄱ
read함수는 stdin으로 받은 값을 name에 저장하고 gets함수는 stdin으로 받은 값을 s에 저장한다.

checksec으로 보호기법을 확인해보자.

이전 문제와 다르게 NX가 disabled 되었음을 확인할 수 있다.
이는 stack에 실행(x) 권한이 존재한다는 의미이므로 쉘코드를 삽입하여 문제를 해결하자.
read를 통해 name에 쉘코드를 삽입하고 gets를 통해 main함수의 ret을 name의 주소로 덮어씌우자.

name에 쉘코드를 삽입해야 하는 이유는 다음과 같다.

아이다에서 name을 더블클릭하면 name의 주소값을 확인할 수 있는데 name은 0x0804A060이다.
앞의 bss는 초기화되지 않은 정적변수를 의미한다.
bss 영역의 컴파일 동안 어느 정도의 크기를 저장할 것이라는 정보를 저장하고 런타임 중에 메모리를 확보함으로 현재는 정확한 주소를 알 수 없다.(정확하지 않음)

이를 바탕으로 exploit.py를 작성해보자.


name에 삽입할 쉘코드를 payload에 주고 s에 삽입할 쉘코드를 payload2에 주자.
payload2는 아무 값으로 구성된 0x18바이트 + 0x0804A060(name의 주소)로 이루어진다.

실행 권한을 주고 실행해보자.

수정해서 원격으로 실행해보자.


- 이 때 context.log_level = 'debug' 로 설정하면 주고 받는 데이터를 확인할 수 있다.
- sendafter, sendlineafter 함수를 쓴 이유는 서버가 느릴 경우 데이터를 보내는 속도와 받는 속도가 확연히 차이가 나서 payload들이 제대로 전송되지 않을 수 있기 때문이다.
- read를 통해 받은 data는 send를 통해 보내야 한다.
read는 0x00, 0x20 등 fgets나 scanf에서 delimter로 받아들여 저장하지 않는 값을 저장하기 때문이다. sendline을 쓴다면 0x00과 같은 데이터가 존재할 경우에 데이터가 중간에 끊길 수 있는 단점을 내포하고 있다. 따라서 send를 써야 한다.

실행해보자.

문제 해결

'wargame > hackCTF' 카테고리의 다른 글

[hackCTF]pwnable x64 Buffer Overflow  (0) 2019.11.27
[hackCTF]pwnable Baisc_BOF #2  (0) 2019.11.27
[hackCTF]pwnable Basic_BOF #1  (0) 2019.11.27