<Wargame & CTF>/Reversing.kr

[Reversing.kr]Easy Unpack

gosoeungduk 2019. 1. 18. 01:00
반응형

문제의 목적은 바이너리의 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