UPX로 패킹되어있으므로, 우선 언패킹한다.
일단 실행해본다. 아래의 화면이 뜬 후, 확인을 누르면 사라진다.
Ollydbg로 실행했는데, 전혀 다른 메시지가 출력된다. 디버거를 탐지하는 IsDebuggerPresent 함수를 쓰는 듯 하다.
예상이 맞았다. 모두 breakpoint 건 후, 반환값을 모두 0으로 바꾸겠다. 또 아래로 내려보면, Killtimer, SetTimer, timeGetTime 함수를 순서대로 볼 수 있다. 함수명으로 시간 관련 함수임을 알 수 있으므로 일단 breakpoint를 건다.
이 IsDebuggerPresent가 포함된 40E940 함수의 마지막에 breakpoint를 걸고 반환값을 0으로 바꾼 뒤 진행해보자. (이후에는 거슬려서 NOP과 XOR EAX, EAX을 이용해 이 부분을 제거했다.)
우선 SetTimer 함수로 타이머를 750ms로 설정한다. SetTimer의 Parameter와 반환값은 아래와 같다.
그 다음 breakpoint인 timeGetTime 함수로 이동한다. CALL까지 수행해보면, EAX 값이 1FDD76D인데, 32524765ms이다.
그 아래에 Sleep 함수를 호출하는 부분이 있다. EBX에 D1이 들어가는 걸로 봐서 Sleep(0xD1)인 것 같다.
이후 444C63의 분기문으로 인해 444D38로 가게되는데, EAX의 값에서 ESI의 값을 빼고, EBX+4에 있는 값과 EAX을 비교하고 EAX가 크면 종료, 아니면 444C71로 가 반복한다.
즉, EAX과 비교하는 값이 정답이다.
'[Wargame Write-up] > CodeEngn Challenges' 카테고리의 다른 글
[CodeEngn Challenges] Advance RCE 01 (0) | 2016.09.14 |
---|---|
[CodeEngn Challenges] Basic RCE 20 (0) | 2016.08.30 |
[CodeEngn Challenges] Basic RCE 18 (0) | 2016.08.30 |
[CodeEngn Challenges] Basic RCE 17 (데이터 주의...) (0) | 2016.08.30 |
[CodeEngn Challenges] Basic RCE 16 (0) | 2016.08.30 |