문제
이 프로그램은 몇 밀리세컨드 후에 종료 되는가

우선 문제를 열어보면 패킹 되어 있다. PEiD로 보자.

UPX로 패킹 되어 있다. 언패킹 해주자.


정상적으로 뜬다!

프로그램을 실행시키다 보면 위와 같은 에러 창이 뜬다.

에러 창이 뜨는 곳에 BP를 걸고 다시 실행해보았다.

0040EA50 함수에 들어가서 에러 메시지가 뜨는 곳을 보니 주소 0040EAF9였다.
해당 주소로 가서 보자.


들어가보았더니 위와 같이 IsDebuggerPresent 함수로 안티 디버깅을 수행하고 있었다.
디버깅이 탐지되면 에러 메시지를 출력하는 주소 004338DE로 이동한다.
그럼 004338DE로 이동하는 명령어 부분을 고쳐보자.

JNZ를 JZ로 변경해주었다.
다시 실행해보자.

0040EA13에서 메시지 박스가 뜨는 것을 볼 수 있다. 여기에 BP를 걸어두고 들어가보자.

F8로 하나하나 실행했더니 0040B21A에서 메시지 박스가 뜨는 것을 확인할 수 있었다.
또 여기에 BP를 걸고 들어가보자.

마지막 CALL인 CALL EAX에서 메시지 박스가 출력된다. CALL EAX에 BP를 걸어두고 실행하자.

그 다음으로 창이 뜨는 주소는 0045E05F다. 여기도 역시 BP 걸고 들어가보자.

타고

타고

또 타고 들어가다 보니 내가 지금 잘못 풀고 있는 것 같다.
USER32.... 인 걸 보니 그냥 내장 함수 계속 들어가고 있는 기분 . . . .
다른 방법을 찾아보자.

명령어를 다 뽑아서 Sleep에 BP를 걸어보자. 오 . . 하나도 안 들어온다. . .^^ . .
다른 시간 관련 함수를 찾아보자.

시간은 time이니까 , , , t로 시작하는 함수를 찾아봤더니 timeGetTime이라는 함수가 있었다.
다 BP를 걸어두고 실행해보자.

걸렸다 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
timeGetTime 함수는 프로그램이 시작된 후 지금까지 흐른 시간을 ms 단위로 리턴한다.
그럼 return 한 값과 정해진 시간 값을 비교할 테니까 비교하는 곳을 찾아보자.

한 줄씩 내리다보면 JUMP를 타고 00444D38로 이동하게 된다.
그 다음에 바로 CMP가 있는데 eax값(timeGetTime으로 받아온 값)과 DS:[EBX+4] 값(비교 대상이 되는 값)을 비교하고,
eax 값이 더 클 때 JNB를 수행한다.

만약 eax 값이 더 작다면, 00444C5F로 이동하게 되고 해당 위치로 가보면 timeGetTime임을 알 수 있다.
즉, DS:[EBX+4]에 해당되는 값이 우리가 찾고자 했던 밀리세컨드이다.
2B70 == 11120이다.
답 : 11120

'Wargame > CodeEngn' 카테고리의 다른 글
CodeEngn Advanced RCE L05 (0) | 2021.05.24 |
---|---|
CodeEngn Basic RCE L18 (0) | 2021.05.20 |
CodeEngn Basic RCE L17 (0) | 2021.05.19 |
CodeEngn Basic RCE L16 (0) | 2021.05.18 |
CodeEngn Basic RCE L15 (0) | 2021.05.17 |