AutoItCompile로 된 이 파일은 자동적으로 IsDebuggerPresent 함수로 보호가 되어있다.
IsDebuggerPresent 의 리턴값을 0으로 수정하여, 탐지를 피하자. (3번째 줄을 Xor eax,eax 로 수정)
문제가 몇 밀리세컨드후에 종료되나 이었으므로 관련되어 보이는 함수에 브레이크포인트를 걸겠다.
모든 timeGetTime 과 스크릿샷에는 없지만 Sleep함수에 브레이크 포인트를 걸었다.
이 곳에서 멈추게 되는데, timeGetTime 과 Sleep이 있는 것으로 보아 이 곳인 것 같다.
확실하게 하기 위해서 분석을 해보자
MSDN에서 timeGetTime을 검색한 화면이다.
시스템이 시작했던 시간부터 지금까지의 시간을 밀리세컨드로 반환한다. 이 값은 DWORD이며, 0 ~ 2^32milliseconds 까지 다룰수 있으며, 결과적으로 49.91일 까지의 시간을 표시할 수 있다.
……..중략……….
여기가 문제 답의 메인 부분이다.
분석의 결과는 이렇다.
- timeGetTime 의 함수를 부름
- Sleep 10 밀리세컨드
- 특정 값과 비교
- timeGetTime 함수를 부름
- 반복
반복 중에, 특정 값을 넘어서게되면 반복을 멈추게 된다. 즉, 특정 값이 원하는 멈춘 밀리세컨드가 된다.
유의점
- 함수가 함수포인터로써 불러지게 된다. 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 |