Simples Crackme 17
- Question
· Message Box가 종료되는 시간을 구해 MD5 Hash 값으로 변환하는 문제이다.
- Solve
· OllyDbg로 실행시켜보면 경고창이 출력되는데 'code section is either compressed...' 즉 압축되어 있다는 것을 확인할 수 있다.
· PEID로 확인해보면 EP Section이 UPX로 Packing되어 있다는 것을 확인할 수 있다.
· UPX를 통해 Packing된 File을 해제시킨다.
· OllyDbg를 통해 File을 실행해보면 정상적으로 실행되는 것을 확인할 수 있다.
· 하지만 Debugging을 진행해보면 Debugging 탐지 API(IsDebuggerPresent)가 사용된 것을 알 수 있으며 따라서 이 함수를 먼저 찾아야 한다.
· 'All referenced text strings'를 통해 찾으면 찾을 수 있다.
· 이 Program에서는 'IsDebuggerPresent' 함수를 직접 사용하지 않고 DLL에서 문자열에 해당하는 함수를 호출해 사용하는 'GetProcAddress' 함수를 이용해 'IsDebuggerPresent' 함수를 사용하고 있다.
· 따라서 이 함수가 실행되기 전에 JMP문을 이용해 다른 곳으로 이동시켜주면 된다.
· 'JE SHORT Simples_.00445A9B' 이 명령어를 'JMP SHORT Simples_.00445A95'로 수정해주면 된다.
· 수정 후 'Search for → Name(label) in current module'를 통해 MessageBox 함수를 찾는다.
· 찾아보면 MessageBoxA와 MessageBoxW가 있는 것을 확인 할 수 있으며 어떤 것이 Program을 실행했을 때 나오는 Message인지 알 수 없으므로 모두 BP를 설정해준다.
· 이후 실행을 시켜보면 '0040DDB7'영역의 MessageBoxW가 Program을 실행했을 때 나오는 MessageBox인 것을 확인 할 수 있다.
· 하지만 근처에서 시간을 받아오거나하는 함수는 위쪽이 아닌 아래쪽에서 'timeGetTime'이라는 함수를 찾아볼 수 있다.
· 따라서 위와 같이 BP를 설정해 어느 구간에서 시간을 얻어오는 함수 쪽으로 넘어가는지 알아본다.
· 확인해보면 'CALL DWORD ...'부분이 실행된 이후 'CMP ESI, EBX' 명령어가 실행되는 것이 아닌 'PUSH EBX' 명령어 쪽 즉, 'timeGetTime' 함수 쪽으로 실행되어 시간 값을 알아오는 것을 확인할 수 있다.
· 시간 값을 확인하는 구간 확인
◦ 1) MessageBox가 실행된 직후 현재시간을 가져온다.
◦ 2) 가져온 현재 시간을 ESI에 저장한다.
◦ 3) 현재 시간을 가져온다.
◦ 4) 현재 시간에서 MessageBox가 실행된 직후의 현재시간을 빼서 MessageBox가 실행된 이후부터 경과시간을 EAX에 저장한다.
◦ 5) EAX 값과 0x27ED(10221)을 비교한다.
◦ 6) 시간 값이 0x27ED보다 크다면 MessageBox가 종료되도록 Button을 누른 효과와 같은 효과가 나타나도록 종료 Routine 쪽으로 이동한다.
· 0x27ED와 비교를 하기 때문에 종료하는데 걸리는 시간은 0x27ED 즉, 10.221초가 된다.
- Answer
· 10221millisecond의 MD5 Hash 값 : a59afb1b7d82ec353921a55c579ee26d
'Reversing > Simples Creckme' 카테고리의 다른 글
Simples Crackme 18 (0) | 2015.08.16 |
---|---|
Simples Crackme 16 (0) | 2015.08.16 |
Simples Crackme 15 (0) | 2015.08.16 |
Simples Crackme 14 (0) | 2015.08.16 |
Simples Crackme 13 (0) | 2015.08.16 |