본문 바로가기

[Wargame Write-up]/CodeEngn Challenges

[CodeEngn Challenges] Basic RCE 19



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과 비교하는 값이 정답이다.