문제 푸느라, 사실 삽질하느라 날아간 일요일을 기리며 허허...
주말저녁에 문제 풀고 writeup 쓰고 있는게 싱숭생숭하면서도 보람차네요(사실 풀고나면 별거 아니지만요)
======================================================
보호 기법 확인(checksec)
CANARY, NX 확인, 서버 환경 상 ASLR enable.
프로그램 동작 분석
x86 binary, 실행 시 사용자의 입력을 받고 프로그램 종료.
겉보기엔 모르니 리버싱을 해봅시다
바이너리 리버싱
main() 에서 사용자 입력을 받아 한 글자씩 파싱. do_brainfuck() 함수 내부에서 각 case에 알맞는 기능을 처리
여기서 p 변수를 살펴보면 main() 에서 p = &tape 로 초기화하고 이때 값은 0x804a0a0 .
이 함수에서 p 의 값을 이용해 ++, --, putchar ... 등등 처리를 해주므로 이것을 이용해 볼 수 있겠다.
Exploit 전략 구성
0x804a0a0 값을 기준으로 >, < 를 이용해 메모리 값을 변경할 수 있고 getchar(), putchar() 명령을 사용할 수 있다.
다만 BOF나 다른 취약점이 아니므로 stack을 마음대로 바꾸지 못하고, parameter로 넘어가는 값을 쉽게 조작할 수 없다.
system(/bin/sh) 를 실행하기 위해 어떻게 할까
- puts() 이용 ?
puts의 GOT를 system으로 덮어쓰고 "[ and ] not supported." 를 overwrite 하려고 했는데 당연하게도 위 string의 위치는 쓰기 권한 없음
위 영역에 어떻게 접근해서 써야하나 고민 많이 했는데 당연히 안됨. 실패.
- putchar() 이용 ?
위와 비슷하게 _putchar의 GOT를 system으로 덮고 파라미터로 넘어가는 ds:p를 조작해 /bin/sh string 주소를 넘김
하지만 넘기는 값이 byte ptr [eax] 이므로 메모리 주소가 정상적으로 넘어가지 않음.
코드를 좀더 꼼꼼히 봤어야 했는데.. 실패.
- setvbuf() 이용 !
main() , do_brainfuck() 에서 이용하는 함수 중 첫번째 parameter를 control할 수 있는 함수가 뭐가 있을까 살펴보다가
setvbuf 호출 시 첫번째 parameter는 stdin 으로
해당 값은 bss 영역으로 Read/Write 권한이 있다.
이를 이용해 다음과 같이 system(/bin/sh) 을 위한 전략을 구상했다.
1 - setvbuf() GOT 를 system() 으로 overwrite. ( 문제에서 libc도 제공하므로 두 함수 사이의 offset 계산 가능 )
2 - stdin overwrite
0x804a040 : 0x804a044
0x804a044 : /bin/sh\x00
3 - puts() GOT 를 main() 내 setvbuf() 호출하는 코드 주소로 overwrite ( 위의 경우는 0x80486b9 )
4 - '[' 입력으로 puts() 호출.
정상적으로 쉘 획득하는 것을 확인함.
공격 코드
'Pwnable.kr > Rookiss' 카테고리의 다른 글
[pwnable.kr] loveletter - 50pt (0) | 2018.09.07 |
---|---|
[pwnable.kr] crypto1 - 120pt (0) | 2017.05.20 |
[pwnable.kr] md5 calculator - 200pt (0) | 2017.01.02 |
[pwnable.kr] fsb - 20pt (0) | 2016.11.17 |
[pwnable.kr] echo2 - 50pt (0) | 2016.11.10 |