codeengn basic 19번 문제다.

오... 드디어 새로운유형.... 몇초 후에 종료 되는지 알아보란다. 시간과 관련이 있을 것 같다.

파일부터 실행 해 보자. 저렇게 프로그램이 실행되고 어느정도 시간이 지나면 프로그램이 종료된다.

이제 패킹 확인후 파일부터 열어보자.

언패킹 후 파일을 실행해보니 실행이 안된다.

뭔가가 막고있다. 함수들을 확인해보니 IsDebuggerPresent 함수가 막고있었다. 이전에 했던 간단한 우회니 가볍게 회피해보자. 이후 부턴 실행이 잘 된다.


다음으로 이제 시간과 관련해서 뭔갈 찾아야 한다. 함수 목록을 확인해보니 맨처음 보인게 Sleep 함수였

다. 일단 모르니까 sleep함수에 죄다 BP걸고 돌려봤다. 근데 하나도 걸리는게 없다. 여기서부터 멘붕 시

작. 다른 시간관련 함수를 찾아야 하는데 내눈이 사시인지 왜 이걸 의심을 못했지.. ㅡㅡ timegetTime

이라는 함수를 못찾아서 엄청나게 해맸다. 여기서 애초에 내가 뭔가 잘못짚고 있나 싶어서 이러다 결국

포기할까봐 찾아봤다...하... 근데 대충보니 풀이는 볼 것도 없고 그냥 저 함수를 발견하냐 못발견하냐의

문제였다. 아 그냥 더 삽질해서 찾아볼걸..ㅡㅡ  

그래서 timegetTIme 함수에대해 검색을 해봤다. 

윈도우(운영체제)가 시작되어서 지금까지 흐른 시간을 1/1000 초 (milliseconds) 단위로 DWORD형을 리턴하는 함수란다.

그럼 이제부턴 간단하다. F8로 하나씩 실행하면서 분석해봤다.

먼저 최초로 timeGetTime 함수가 실행되면 EAX에 반환된 프로그램 실행시작 값을 ESI에 저장시켜 놓는다. 그 후 CALL EDI를 통해 timeGetTIme 함수를 호출할 수 있기 떄문에 두번째로 실행시킨 함수의 값으로 최초시간과 비교를한다. 두번째로 호출된 함수는 항상 최초 시작값인 ESI값보다 클수밖에 없기 때문에 점프를 하여 다음 사진의 위치로 간다.

다음과 같이 점프해서 오면 EAX에는 두번째로 호출됬을때 시간값이 담겨있고 이를 최초값과 SUB한다.

그러면 실행 후 현재까지의 시간이 EAX에 저장이 되고 이 시간값이 다음의 CMP구문에 있는

 DWORD PTR DS:[EBX+4] 값과 비교가 된다. DWORD PTR DS:[EBX+4] 00002B70이라는 값으로

나와있고 EAX값이  00002B70 보다 작으면 다시 두번째로 timegetTime함수가 호출되었던 위치로 돌

아가 이 과정을 계속 반복한다.  그러다 timegetTIme함수가 호출된 값이 최초 시작값과 SUB되

어  00002B70 값보다 커지게 되면  JMB 19.00444C71에서 점프가 안되서 다음 점프문을 통해 프로

그램 종료 위치로 넘어가게 된다. 이 흐름만 이해한다면 뭘 기준으로 프로그램이 종료되는지 아실테니

정답은 뭔지 다들 짐작하실 거라고 생각한다.

분석할 함수를 못찾아서 검색하고 풀어 괜시리 찝찝했던 문제.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn advance 1번  (0) 2018.02.04
code engn basic 20번  (0) 2018.02.04
code engn basic 18번  (0) 2018.02.04
code engn basic 17번  (0) 2018.02.04
code engn basic 16번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,