본문 바로가기

Let's Study/Hacker's CTF

[2015 Nullcon] exploitable 300

 이 문제 이 외에도 여러 문제가 있지만 이 대회는 왠지모르게 씽크빅 대결인 듯 하여 그나마(?) 기술적인 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


exp.py


sample 은 exploitable 300 바이너리,

exp.py 는 제가 짠 파이썬 코드입니다.