EXE 바이너리 하나가 주어집니다. unpackme 라는 이름 답게 패킹이 되어있는 것을 확인할 수 있는데요. 언패킹 루틴은 단순 XOR로 그리 복잡하지 않습니다. 언패킹 과정 후에는 다음과 같은 주소로 뜁니다.
위 함수에서 더 타고타고 들어가다 보면 main격의 함수가 호출되고 그 함수 내에서 아래와 같은 루틴을 실행합니다.
저 루틴이 실행되기 전에 프로세스 검색같은거 체크를 거치는데 결국에는 변수 하나를 검사하는거라 그 부분 우회하고, Sleep도 인자 조종해주고 나면 unpackme_unpackme.tmp를 드랍하는 부분으로 갈 수 있습니다.
드랍하는 부분 보면 한 공간을 RtlDecompressBuffer 함수를 이용해 압축해제를 하는 것을 볼 수 있습니다. 압축해제한 후의 메모리를 덤프해서 파일로 저장하면 tmp 파일을 확인 가능합니다.
푼 파일을 분석하다보면 0x401410 함수를 호출하는 게 보입니다. 이 루틴은 정상적으로는 갈 수 없고 직접 EIP 변경을 해주거나 패치를 해야만 도달할 수 있습니다. 이 루틴을 거치기 전에 자기 자신을 삭제하는 함수로 뛰게 되는데, 저는 그런 식으로 분기하는 루틴을 모두 NOP 처리 해주었습니다.
0x401410에서는 0x401310 함수를 부르는데 이 함수는 주어진 인자를 디코딩해서 출력해주는 함수입니다. 이 부분에서도 자기자신을 삭제하는 곳으로 뛰는 트랩이 몇몇개 있는데 그거 다 NOP 처리해주고 실행하면 문자열이 주르륵 출력됩니다. 그 중에 Flag가 섞여있습니다.
뿅
'CTF' 카테고리의 다른 글
[codegate2016] bugbug (2) | 2016.03.19 |
---|---|
[HackIM] sandman (0) | 2016.03.03 |
[hitcon2015] blinkroot (0) | 2015.10.20 |
[Layer7 2015] Reverse Me, Easy Rerversing (0) | 2015.09.01 |
Codegate 2015 bookstore (0) | 2015.03.17 |