이번 문제는 내가 지금까지 공부했던 Packer의 지식을 이용하는 문제라 재미있을 것 같아서 해보았다.
문제에서 구하고자 하는 것은 OEP가 어디인지 파악하는 것이다.
코드를 분석하기 앞서 이 파일이 어떤 패커로 패킹이 되었는지 DIE(Detect-It-Easy)로 확인해 보았다.

Imports like UPX로 되어있는 것 보아 UPX인 것 같다. 근데 PEView로 보면 PE 파일 포맷이 아래와 같다.

분명 UPX의 파일 포맷은 .upx0, .upx1 이었던 것 같은데 저 이상한 Section_Header들(Gogi , GWan)을 보니 upx는 아닌 것 같고 제작자가 별도로 커스텀해서 패킹한 파일인 것 같다.

그리고 PE Image는 위와 같이 로딩되었다.

코드의 시작은 아래와 같다.
1.

코드를 쭉 읽다보면 해당 반복문이 나온다. 409000부터 적혀있는 값들에 대해 0x10,0x20,0x30,0x40,0x50을 순서대로 XOR 해준다.

이 값들 어디서 많이 본 것 같은데...? 해서 보니 아까 봤던 이상한 섹션 헤더 값이다.

이 과정이 디코딩 하는 과정으로 추측된다.

이 코드 과정을 진행하다 보면 계속 반복됨을 알 수 있는데, 이 과정은 IAT값을 세팅하는 과정이다.

이후에 과정에서 1과 같이 다시 디코딩하는 과정이 나온다. 이 때 ecx는 0x401000을 가리키는 데 해당 주소는 .text 영역이다.

이후 디코딩 과정이 한 번 더 나온다. 이 때 ecx는 0x406000을 가리키는데 해당 주소는 .data 영역이다.

마지막에 jmp 401150이 있는데 이 주소를 타고 가면 아래의 코드가 나오고

push ebp, mov ebp,esp와 같은 함수 프롤로그를 보니까 401150이 OEP라는 것을 알 수 있다.
결론 : OEP = 0x401150
디코딩 하는 과정만 제대로 읽고 넘어갈 줄 알면 쉽게 풀리는 문제였다.