CodeEngn Advance 1
문제 : 이 프로그램은 몇 밀리세컨드 후에 종료 되는가 정답인증은 MD5해쉬값(대문자)변환 후 인증하시오
실행해보니 처음에 PUSHAD가 보여서 PEiD로 확인해보니 UPX로 패킹 되 있는 프로그램이라서, 먼저 UPX툴로 언패킹을 하고 시작했다.
실행 시간 값 구하는 문제라서 sleep과 timegettime 함수들에 브레이크포인트를 걸어주고, 실행했더니, 비정상적으로 리턴하고 다시 진행되다가 그림 2같은 에러창이 떴다.
함수목록에서 안티 디버깅 함수중 IsDebuggerPresent를 찾아서 TEST EAX,EAX를 CMP EAX,EAX 로 수정했다. 그럼 Z플래그가 1로세팅되서 0040E969에서 에러 메시지 출력하는 분기점으로 넘어가지 않는다.
안티디버깅 해제후 진행을 하니 계속 프로그램이 무한루프에 빠진건지 멈춰버리는 일이 발생했다. 해당 함수를 브레이크포인트 걸고 함수내부를 확인하다 또다시 멈추고 이런 반복을통해 0040eaf9, 0040ea13, 0040b218, 0040bcc0, 00444d3a, 0045E05F, 00444db8, 77D46574 총 7번을 들어가보니 WaitForSingleObject 라는 함수를 발견했다. 그전까지는 메시지박스 관련된 함수들만 나왔는데 처음보는 함수라서 구글에 검색해보니 Thread가 특정 signal이 발생할 떄 까지 정지해 있다가, signal (Exit_event) 을 받으면, 작업을 수행할 때 사용하기 위한 api라고한다. 문제랑은 큰 관련이 없다.
WaitForSingleObject function -Waits until the specified object is in the signaled state or the time-out interval elapses. (출처 MSDN)
timeGetTime함수전체에 브레이크 포인트를 걸고 F9로 실행해버리면 계속 무한루프에 빠저서 천천히 관련 없는 함수를 넘기고 직접 timeGetTime함수가 있는 곳까지 하나하나 진행했다. Basic19에서 밀리세컨즈 구하는 문제랑 비슷하게 timeGetTime함수가 실행된후 ESI값과 EAX값을 비교하고 같지 않으면 EAX에 ESI를 빼고 그 값을 EBX+4 스택에 저장된 값과 비교를한다. Basic에서 푼 문제와 거의 완전히 유사한데 중간중간 프로그램이 멈춰버리는 부분들이 많다.
00444c44에서 리턴된 EAX를 ESI에 넣고 00444c59에서sleep후 00444c5f에서 timeGetTime를 실행해서 리턴된 값을 ESI(위에서 리턴된 timeGetTime 값)와 비교해서 00444D38로 점프한다.
점프해보면 00444D38에서 기록된 시간값(timeGetTime함수 리턴값) 둘을 빼서 걸린 시간을 연산하고 그후에 EBX+4 스택에 있는 값과 비교를 한다.
00444C44에서 루틴에 들어온 시간을 리턴하고, 00444C59에서 Sleep실행 후 다시 00444C5F를 실행할 때 까지의 시간을 리턴 한 뒤 서로 빼서 걸린 시간을 계산하는 문제다.
따라서 EBX+4에 저장된 값 337B 십진수로 바꾸면 “13179” MD5 해쉬값 으로 암호화하면 정답은 “DB59260CCE0B871C7B2BB780EEE305DB” 다