Without a Break

[CodeEngn] Basic RCE L19 본문

Reversing/Wargame

[CodeEngn] Basic RCE L19

와븨 2023. 5. 23. 21:41

문제

 

 

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

 

실행 파일을 언패킹 해줬다.

 

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

 

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

 

intermodule에서 검색해보니 두 함수 모두 있음을 확인할 수 있었다.

 

IsDebuggerPresent의 위치로 이동해보니 TEST EAX, EAX 코드가 있었다. 

프로그램을 실행하면 0040E969의 연산으로 인해 JNZ로 이동하여 프로그램이 종료되는 코드로 이동하기 때문에 이동하지 않도록 코드를 수정해준다.

TEST는 각 데이터를 AND 연산하는데, 이 연산을 건너뛰기 위해서 CMP EAX, EAX로 수정해준다.

 

 

이제 다시 intermodule로 돌아와서 이번에는 timeGetTime 함수를 살펴보자.

TimeGetTime 함수는 굉장히 많다.

시작하는 TimeGetTime 함수를 찾기 위해 모든 TimeGetTime 함수에 BP를 걸어준다.

 

BP를 걸어준 후, F9로 실행하면 첫번째 timeGetTime 함수의 위치로 이동한다.

함수 이후, 코드 진행을 살펴보니 JNB(크거나 같으면 분기)로 0044D38로 점프하는 것을 알 수 있었다.

 

F8로 실행하다보면 JNB로 인해 00444D38로 이동한다.

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

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

 

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

 

구한 값을 10진수로 변환해주면 몇 밀리세컨드인지 답이 나옴

 

성공!

'Reversing > Wargame' 카테고리의 다른 글

[Dreamhack] rev-basic-0  (0) 2023.08.13
[CodeEngn] Advance RCE L01  (1) 2023.05.23
[CodeEngn] Basic RCE L18  (0) 2023.05.18
[CodeEngn] Basic RCE L17  (0) 2023.05.18
[CodeEngn] Basic RCE L16  (0) 2023.05.17