CodeEngn basic 19

코드엔진 basic 19번 문제풀이

파일을 실행해보면 아래와 같은 창이 뜨면서 잠시 뒤 종료된다.

basic19

PEiD로 파일을 열어보면 UPX로 패킹된 것을 알 수 있다.

basic19-1

언패킹을 한 뒤 올리 디버거로 파일을 열고 실행해보면 아래와 같은 에러 메시지가 뜨면서 실행이 안 되는 것을 볼 수 있다.

basic19-2

안티 디버깅이 된 파일인 것 같으므로 IDA를 이용해 파일을 열어 안티 디버깅 API함수가 있는지 찾아보면 아래와 같이 0040E961주소에 IsDebuggerPresent가 있는 것을 확인할 수 있다.

basic19-2

이제 올리 디버거로 파일을 다시 열어 주소 컨트롤 + g를 눌러 주소40E961를 찾아서 브레이크 포인트를 건 뒤 실행해 IsDebuggerPresent로 간다.

basic19-4

IsDebuggerPresent함수 아래를 보면 jnz분기문이 보이는데 이 구간을 패치하여 파일이 디버거에서도 정상적으로 동작하게 하였다. (난 jnz 주소를 점프 문 다음인 40E96F로 바꿔주었다.)

basic19-5

이제 패치 된 파일을 열어서 시간과 관련된 함수들이 있는지 찾아보면 TimeGetTime이라는 함수를 찾을 수 있고 여기에 브레이크 포인트를 걸어 실행해보면 아래와 같이 주소 00444C44에서 멈추는 것을 확인할 수 있다.

basic19-6 basic19-7

이제 이 구간을 차근차근 분석해 보면 timeGetTime함수를 사용해 파일이 시작되고 현재까지 흐른 시간을 밀리 세컨드 단위로 가져와서 esi에 저장하고 다시 한번 timeGetTime함수를 불러와 eax에 저장한 뒤 eax와 esi의 시간을 비교하여 앞의 값이 더 크거나 같으면 eax에서 esi를 뺀 뒤 어떤 값과 비교하여 eax값이 저장된 값보다 크거나 같으면 파일 실행을 종료하는 것을 알 수 있으므로 EBX+4에 저장된 값을 찾아보면 2B70이므로 10진수로 변환해 보면 11120이라는 값이 나오게 된다.

basic19-8

즉 파일을 실행하고 난 뒤 11120ms가 지나면 자동으로 종료된다는 것을 알게 되었고 ms값을 구하는 문제였으니 정답은 11120이 된다.