이 문제 이 외에도 여러 문제가 있지만 이 대회는 왠지모르게 씽크빅 대결인 듯 하여 그나마(?) 기술적인 exploitable 문제 하나 포스팅합니다.
바이너리를 실행해보면 Command% 가 나옵니다.
사용법은 set [name] [data]
get [name]
set a 1234
get a
를 하면 a 에 1234가 저장되서 get a 로 1234가 출력됩니다.
이것만으로는 아무것도 모르므로 gdb로 분석합니다.
main 함수를 보면 input_loop 함수로 넘어가고
여기로 넘어가면 "Command%" 출력 후 fgets로 문자열을 받고 process_command 함수로 넘어갑니다.
여기는 strstr 함수로 비교를 해서 help입력 시, help 함수로, exit 입력시 exit.
strcmp로 set 입력 시 command_set, get 입력 시 command_get 으로 이동하는 것을 볼 수 있습니다.
중요한 부분은 command_set에서 strcmp(buf, "key")로 set key 를 입력 시, set_key로 넘어가서
버퍼에 플래그값을 채우는 부분입니다.
command_get 에서 get key를 입력 시, 아무것도 안하고 종료하기 때문에 set key를 입력했을 때 플래그가 버퍼에 들어가는 것을 이용해 공격을 시도해야 합니다.
command_set 에서는 set 명령어로 버퍼에 값을 하나씩 넣을 때마다 memset(buf, 0, 0x1001)로 4096바이트단위로 초기화해주는데 처음 set a "a" * 4096 을 하면 버퍼에 a가 4096개로 꽉 차게 되어 다음 메모리를 할당받을 때 a의 버퍼와 겹치게 됩니다.
이렇게 되면 그 다음 set key를 입력했을 때
"a" * 4096 + "Flag" 값이 겹치게 되어 get a를 입력 시 플래그값과 함께 딸려나오게 됩니다.
볼까요.
sample 은 exploitable 300 바이너리,
exp.py 는 제가 짠 파이썬 코드입니다.
'Let's Study > Hacker's CTF' 카테고리의 다른 글
[2015 Plaid CTF] pwnable_EBP 160p (0) | 2015.04.21 |
---|---|
[2014 Hack.lu] guess the flag write-up (0) | 2014.11.27 |
[2014 화이트햇 콘테스트] 한글치환암호 (0) | 2014.11.10 |
[2014 화이트햇 콘테스트]Cold War (0) | 2014.11.10 |