Reversing/Wargame

[CodeEngn] Advance RCE L01

와븨 2023. 5. 23. 21:50

문제

 

실행 파일이 UPX로 패킹되어 있음

 

언패킹 해준다.

 

실행 파일을 디버거로 열어 프로그램을 실행하니 위와 같은 팝업창이 뜬다.

 

프로그램의 실행과 종료 시간을 다루는 함수로는 timeGetTime, IsDebuggerPresent가 있다.

 

먼저 TimeGetTime 함수를 보자.

timeGetTime 함수는 여러 개가 있으므로, 처음 시작되는 함수를 알기 위해 모든 intermodule에 BP를 걸어준다.

 

IsDebuggerPresent 함수도 살펴보자.

 

IsDebugguerPresent 함수의 위치로 가보니 TEST EAX,EAX 코드가 있었다.

이 부분을 F8로 실행해보면 TEST 연산으로 인해 JNZ로 프로그램의 종료 코드 진행쪽으로 이동하므로, 이를 피하기 위해 TEST EAX,EAX -> CMP EAX, EAX로 수정해준다.

 

IsDebuggerPresent를 수정해주고 F9로 프로그램을 실행하면 처음으로 시작되는 timeGetTime으로 이동된다.

코드 진행을 살펴보니 timeGetTime 함수를 호출 후, 0044D38로 이동하는 것을 알 수 있다.

 

timeGetTime 함수를 호출하는 곳부터 F8로 진행하다보면 위의 위치로 이동한다.

여기서 EAX와 ESI는 각각 경과 시간과 처음 시간을 나타낸다.

EAX 값에서 ESI 값을 뺌으로써 프로그램이 몇 밀리세컨드 후에 종료되는지를 알 수 있다.

 

00444D38을 F8로 실행하면 뺸 값을 알 수 있다.

 

구한 값을 10진수로 변환해주면 몇 밀리세컨드 후 종료하는지를 알 수 있다.

 

답은 MD5 해쉬값으로 변환해야 함.

 

성공!