문제의 목적은 바이너리의 OEP(Original Entry Point) 를 구하는 것이다.
처음에 문제 제목을 까먹고 PE View에 나와있는대로 OEP를 적었다가 틀렸다 .. :) ;; ㅋㅋㅋㅋㅋ
(Packing 된 상태의 OEP)
OllyDbg 에서 search for all intermodular calls를 했더니 함수가 얼마 나오지 않는 것으로 미루어 짐작하면
패킹이 되어있음을 확실히 알 수 있다.
패킹 방식은 보다시피 나오지않는 유명하지않은 패킹 방식인듯 하다.
그러면 이제 생각할 것은 매뉴얼 언패킹을 시도하는 것이다.
<매뉴얼 언패킹 방식(이 부분은 지적해주시면 공부하도록 하겠습니다)>
확신할 수 있는 것은 패킹된 바이너리도 실행할 때에는 분명히 패킹으로 인해 변조된 OEP가 아닌
본래의 OEP를 거쳐서 프로그램을 실행한다는 점이다. 우리는 그 점에서 매뉴얼 언패킹을 시도할 수 있는 것이다.
이 때 알아두어야할 점은 바이너리가 실행되기 위한 언패킹 시점에서 레지스터를 사용하기 위해 언패킹 시점 직전에
레지스터의 값들을 PUSH명령으로 스택에 보관한다는 점이다. 물론 언패킹(또는 디코딩?) 과정이 끝나면 POP으로 값을 가져온다.
본 바이너리에서 필자는 이와같은 부분을 찾을 수 있었다.
https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-getprocaddress
GetProcAddress 함수는 인자를 2개로 하는 함수이다. (dll 핸들과 핸들 값 얻고싶은 함수이름) 하지만 PUSH 구문이 무려 5번이나 나온다는 점에서 이 부분이 위에서 설명한 부분인 것 같다고 추론하였다....
그러면 이제 실제 OEP로 진입 직전에 레지스터를 POP할텐데 이 때 ESP가 변형된다는 것 때문에 ESP에 Hardware Breakpoint 를 걸어놓고 실행시켜보면 실제 OEP를 찾을 수 있을 것이다. 이를 용어로 ESP Trick이라고 한다고 한다.
예상한대로 OEP가 나왔다!
덤프까지 하여 언패킹을 해도 잘 실행이 되었다
\
\
\
\
\
\
이번 문제는 리버싱 지식이 부족하여 .. ㅠㅠ 뒷걸음질 치다 쥐잡은 느낌도 있어서 다른 Write Up 보면서 보충공부를 해야할 것 같다.
------------------ ※추가※ ---------------------
PEiD로 언패킹 및 OEP찾기가 가능하다고 한다..!!
'<Wargame & CTF> > Reversing.kr' 카테고리의 다른 글
[ Reversing.kr ] Ransomware (0) | 2020.01.02 |
---|---|
[Reversing.kr]ImagePrc (0) | 2019.03.27 |
[Reversing.kr]Replace (0) | 2019.02.08 |
[Reversing.kr]Music_Player (1) | 2019.01.30 |
[Reversing.kr]Easy Keygen (0) | 2019.01.15 |