쉬는시간/pwnable.kr

[pwnable.kr]Toddler - flag 풀이

happy-nut 2017. 5. 25. 21:58

pwnable.kr의 toddler카테고리에 속한 문제 가운데 하나인 flag입니다.

아빠가 나에게 packed된 선물을 주셨다! 얼른 열어보자. 라고 하는 문제입니다. 저는 원래 문제를 풀 때 저런 글 안 읽어보고 바로 다운로드 받아서 푸는 편인데, 문제 자체에 엄청난 힌트가 숨겨져 있었네요. 앞으론 잘 읽어봐야겠습니다. 

그리고 이것은 리버싱 task이고, 너는 바이너리만 있으면 됩니다~ 라고도 쓰여져 있네요.

file명령어로 확인해 보니 64비트용 실행파일(elf)입니다. 64비트용 IDA로 열어보아야 겠습니다.

아무 생각 없이 열어보니, 디컴파일 에러가 납니다. 이런 경우는 처음이라 당황해서 구글링을 해보니, 스택 메모리 구조 상 지정된 주소는 초기 스택 포인터보다 낮은 주소에 있어야 하는데 지정된 주소가 스택 포인터보다 큰 주소에 있기 때문에 발생하는 에러메시지 라고 합니다. 

이 문제를 해결하려고 강제로 스택 포인터도 조작하고 해봤는데, 함수가 열리긴 열리는 데 정말 이해할 수 없는 난해한 코드들이 눈 앞에 펼쳐졌습니다. 스샷을 찍어놓긴 했는데 양도 많고 사실 문제 푸는 데는 도움이 되지 않아서 올리진 않겠습니다.

일단 조금 헤메다가, 이렇게 복잡한 코드인데 실행이나 시켜보자 하는 생각에 곧바로 실행해 보았습니다.

malloc()이랑 strcpy를 할 건데 와서 가져가! 라고 하네요. 뭐지, 후킹 문제인가? 하며 malloc()의 위치를 찾아봐야 겠다는 생각이 들었습니다.

그렇게 찾다 보니 upx.sf.net이라는 문자열이 나왔습니다. 맙소사!! packing되어 있었던 파일이었습니다. 문제를 좀 더 자세히 읽어봤더라면 바로 packing부터 검사를 했을 텐데 말이죠. 경험이 많았어도 한 눈에 알아봤겠지요. 다 제 부족한 실력 탓입니다.

upx 언패킹해주는 툴을 다운받아서 unpack해주었습니다. file하나가 unpack되었다고 하네요.

unpack된 파일을 가져다가 IDA로 열어보았습니다.

malloc의 위치를 찾으러 갔다가, Flag처럼 보이는 문자열을 발견했습니다.

인증해 보니 역시 맞았습니다. 

packing된 프로그램을 unpack해서 분석할 수 있는 지 알아보는 문제였던 모양입니다.