본문 바로가기

CodeEngn RCE

CodeEngn Basic RCE 19

AutoItCompile로 된 이 파일은 자동적으로 IsDebuggerPresent 함수로 보호가 되어있다.

IsDebuggerPresent 의 리턴값을 0으로 수정하여, 탐지를 피하자. (3번째 줄을 Xor eax,eax 로 수정)

문제가 몇 밀리세컨드후에 종료되나 이었으므로 관련되어 보이는 함수에 브레이크포인트를 걸겠다.

모든 timeGetTime 과 스크릿샷에는 없지만 Sleep함수에 브레이크 포인트를 걸었다.

이 곳에서 멈추게 되는데, timeGetTime 과 Sleep이 있는 것으로 보아 이 곳인 것 같다.

확실하게 하기 위해서 분석을 해보자

MSDN에서 timeGetTime을 검색한 화면이다.

시스템이 시작했던 시간부터 지금까지의 시간을 밀리세컨드로 반환한다. 이 값은 DWORD이며, 0 ~ 2^32milliseconds 까지 다룰수 있으며, 결과적으로 49.91일 까지의 시간을 표시할 수 있다.

……..중략……….

여기가 문제 답의 메인 부분이다.

분석의 결과는 이렇다.

  1. timeGetTime 의 함수를 부름
  2. Sleep 10 밀리세컨드
  3. 특정 값과 비교
  4. timeGetTime 함수를 부름
  5. 반복

반복 중에, 특정 값을 넘어서게되면 반복을 멈추게 된다. 즉, 특정 값이 원하는 멈춘 밀리세컨드가 된다.

유의점

  • 함수가 함수포인터로써 불러지게 된다. CALL 다음의 인자가 레지스터인데, 정확히 어떤 함수를 부르는지 주의하자.
  • 컴퓨터의 처리속도는 매우 매우 매우 매우 빠르므로, 사람이 분석 할 시에는 반복을 하지 않을 수도 있다.
    • 그러나, 컴퓨터가 처리 할 때는 매우 빠르므로, 많은 반복을 하게 된다. 분석 시 반복을 하지 않을 수도 있음에 유의하자.
    • 이 차이점을 볼 수도 있는데, OllyDBG의 F8 연타 속도의 차이로서 알 수 있다.


'CodeEngn RCE' 카테고리의 다른 글

CodeEngn Basic RCE 20  (0) 2011.07.05
CodeEngn Basic RCE 17  (2) 2011.07.04
codeengn basic rce 4  (0) 2011.07.02
codeengn basic rce 3  (0) 2011.07.02
codeengn Basic RCE 2 풀이  (0) 2011.06.30