Simples Crackme 14
- Question
· Serial Key '154C-6505-D2ADD0F3-A223-2870'에 맞는 Name을 찾아 해당 Name을 MD5 Hash 값으로 변환하는 문제이다.
· Hint
◦ Name이 두 자리
· 실행을 해보면 Program 상에서는 Name이 세 글자이상이여야 Serial을 확인할 수 있다.
- Solve
· 'Search for → All intermoduler calls'를 통해 Process 내에서 사용된 함수를 확인해보면 Windows API로 만들어진 함수라는 것을 파악할 수 있다.
· 'Search for → All referenced text strings'를 통해 사용된 문자열을 확인해보면 오류 Routine 두 개의 Message(Please Enter Mor Chars.../Please Enter Not More Then 30 Chars...)와 성공 Routine 두 개의 Message(Good Boy!/Well done!)을 확인할 수 있다.
· 실패 Message가 확인이 되지 않는 것을 생각해보면 실패 Routine은 따로 존재하지 않다고 판단할 수 있다.
· 성공 Message 부분을 더블 클릭해 찾아들어오면 위 구간을 찾을 수 있다.
· Serial을 생성 비교하는 구간은 성공 Routine 위쪽에 존재할 것이므로 여기서 Serial을 비교, 생성하는 구간을 찾아야한다.
· 'CALL' 명령어가 사용된 부분을 지날 때 확인 Stack Window를 주시하며 확인 해보면 'CALL Simples_.0045B850'부분이 Serial Key를 생성하고 비교하는 구간이라는 것을 확인할 수 있다.
· Serial 생성
◦ Serial Key를 생성하고 비교하는 구간 내부를 확인해보면 위와 같은 Code를 확인할 수 있다.
◦ '154C-6505-D2ADD0F3-A223-2870'이라는 Serial을 확인 했을 때 Serial은 'AAAA-BBBB-CCCCCCCC-DDDD-EEEE'로 5개의 Patturn을 확인할 수 있으며 Serial을 생성하는 구간이 각 자리별로 5개가 존재해야한다고 생각할 수 있다.
◦ 하지만 실제로 확인되는 반복구간은 4개이다.
◦ 따라서 1개의 구간을 대신하는 사용자 정의 함수를 찾아야한다.
◦ 각 구간 확인
▹ 마지막에 ESI 값을 EDX에 저장하는 것을 확인할 수 있는데 여기서 Serial 'AAAA' 부분은 ESI '825C1DF0' 첫 번째부터 4자리이거나 다섯 번째부터 4자리 인 것으로 판단된다.
▹ 마지막 부분에서 Stack 영역의 값에 더하는 부분을 찾아볼 수 있는데 여기서 EBP-10 영역에 저장된 값이 Serial 'BBBB' 부분은 EBP-10 영역 값 '0FBB10D0' 첫 번째부터 4자리이거나 다섯 번째부터 4자리 인 것으로 판단된다.
▹ 마지막에 EDI 값을 EAX에 저장하는 것을 확인할 수 있는데 여기서 Serial 'CCCCCCCC' 부분은 EAX '912D46E8' 값으로 판단된다.
▹ 마지막 부분에서 EBX 값을 두 번 곱해 EBX에 저장하는 것을 볼 수 있는데 여기서 Serial 'DDDD' 부분은EBX 값 '76071040' 첫 번째부터 4자리이거나 다섯 번째부터 4자리 인 것으로 판단된다.
· Serial 확인
◦ Serial 생성 비교 함수를 빠져나오면 Stack Window에 Serial을 확인할 수 있다.
◦ Serial 비교
▹ 첫 번째 반복구간의 ESI 값 : '825C1DF0' → AAAA 부분
▹ 두 번째 반복구간의 EBP-10 영역 값 : '0FBB10D0' → BBBB 부분
▹ 세 번째 반복구간의 EDI 값 : 'FFB77A3E' → DDDD 부분
▹ 네 번째 반복구간의 EBX 값 : '76071040' → EEEE 부분
◦ 비교해봤을 때 첫 번째 구간의 판단만 맞았고 두 번째 반복구간은 두 번째 자리부터 네 개의 문자, 세 번째 반복구간은 DDDD 부분의 값이며 EAX 값이 아닌 EDI 값이고, 네 번째 반복구간은 EEEE 부분의 값이었다.
◦ 즉, 세 번째 Serial의 값은 어딘가에 숨겨져 있다는 것을 알 수 있으며 반복구간이 아닌 사용자 정의함수를 찾아 봐야한다.
· Serial 생성 구간 재확인
◦ 두 번째 반복구간과 세 번째 반복구간의 사이에 사용자 정의함수를 발견하고 BP를 설정해 실행을 해보았다.
◦ 두 번째 함수를 실행하고 나면 Stack 영역에 위와 같은 ASCII Code가 저장되는데 위에서 생성된 Serial과 비교해보면 'CCCCCCCC'구간의 Serial이라는 것을 확인할 수있다.
· '154C-6505-D2ADD0F3-A223-2870'에 맞는 Name 찾기
◦ '154C-6505-D2ADD0F3-A223-2870'에 맞는 Name을 찾기 위해서는 위에서 확인한 반복구간 네 가지의 Algorithm을 이용해야한다.
◦ 모두 글자 수만큼 반복되기 때문에 입력한 문자 모두를 이용해 Serial을 생성하므로 어떤 Algorithm을 사용해도 상관없다.(필자는 첫 번째 반복구간의 Algorithm을 이용하겠다.)
◦ Key Gen 만들기
▹ 첫 번째 구간을 이용해 똑같이 Code로 만들어보면 위와 같다.
▹ Register의 값은 모두 양수로 존재하기 때문에 unsigned를 이용해 양수로만 규정해야한다.
▹ Build를 마치고 실행해보면 'CT'가 '154C-6505-D2ADD0F3-A223-2870'에 맞는 Name이라는 것을 확인할 수 있다.
- Answer
· 'CT'를 MD5 Hash 값으로 Encoding한 값 : 112c61a276d0376f2f6b25dd3a337b1d
'Reversing > Simples Creckme' 카테고리의 다른 글
Simples Crackme 16 (0) | 2015.08.16 |
---|---|
Simples Crackme 15 (0) | 2015.08.16 |
Simples Crackme 13 (0) | 2015.08.16 |
Simples Crackme 12 (0) | 2015.08.16 |
Simples Crackme 11 (0) | 2015.08.16 |