CodeEngn Basic 19
문제 : 이 프로그램은 몇 밀리세컨드 후에 종료 되는가
디버거로 실행시키면 PUSHAD가 보인다. 패킹 된 프로그램 같다. PEiD로 확인해본 결과 그림 21에서 보이듯이 UPX로 패킹 되어 있다.
직접 OEP를 찾아서 dump해도 되지만, 덤프따기 귀찮기 때문에 UPX를 이용해서 언패킹을 실행했다.
일단 프로그램을 실행시키면 그림 창이뜨고 확인을 누르거나 가만히 기다리면 혼자 종료한다. 일단 Exit가 들어가는 함수들과 문제가 몇 밀리세컨드 후에 종료 되는지 물었기에 sleep 함수를 확인했다. ExitWindowsEx는 윈도우 종료관련 API라서 무시했다.
일단 Exitprocess 함수 부분을 찾아서 브레이크포인트를 걸고 실행해봤더니,그림 25 같은 에러창이 떠서 안티디버깅 API가 있는지 확인했다.
함수목록에서 IsDebuggerPresent 를 확인했고 해당부분에 브레이크 포인트를 걸고 실행했다. 그리고 0040E969에서 에러 메시지박스 호출하는 함수로 가는 분기점에 TEST EAX,EAX를 CMP EAX,EAX 로 수정해서 Z플레그가 1이되게 저장했다.
그리고 다시 실행해보니 Exitprocess는 메시지창이 출력된 후에 확인을 누른후 종료하는 루틴으로 판단되고 sleep도 전부 브레이크포인트를 걸어봤지만, 별다른게 없어서 timeGetTime에 전부 브레이크포인트를 걸어봤다. 그후 실행시키고 브레이크포인트부터 진행하면 2번반복후 0041621E에서 계속 멈추고 재 시작하는 순간 메시지박스가 생기고 사라진다. 반복문 안에서 진행 시간이 어딘가 기록된다 판단하고 그 부분을 찾아봤다.
반복문이 두 번 실행하는데 그림 27을 보면 00444D3A에서 BTX+4값은 2B70 으로 고정되고 EAX값은 실행시키고 00444D3A까지 내려오는 시간이 기록된다. 그리고 진행하면 99444D4E에서 다시 위로 점프하고 두번째는 00444D3D에서 점프를 실행한 뒤 00444D54에서 끝나는 루틴으로 진행한다.
실행 하는 동안의 시간 값인 EAX가 EBX+4와 비교되는 것을 봤을 때 해당 값을 정답이라 판단했다. 2B70을 10진수로 바꾸면 11120 코드엔진에 확인한결과 정답이다.