Simples Crackme 8
- Question
· 알맞은 Serial을 찾아 입력하는 문제이다.
· Serial이 맞지 않으면 'Badboy,try it harder u can do it:P'이라는 Message를, 맞으면 'Yup,you did it! now make a tutorial:)!'이라는 Message를 출력한다.
- Solve
· 'Search for → All intermodular calls'를 이용해 내부 함수를 파악해보면 Win API를 이용해 만들어진 Program이라는 것을 알 수 있다.
· 'Search for → All referenced text strings'를 이용해 성공, 실패 Routine의 위치를 파악한다.
· MessageBox 함수 세 개를 확인해보면 실패, 성공, Error Message가 있는데 실패는 Serial이 맞지 않을 시, 성공은 Serial이 맞을 시, Error는 Serial을 넣지 않을 시 출력된다.
· 위 Routine들이 실행되기 전 마지막 JMP 명령을 확인해보면 'JNZ SHORT Simples_.004011D8'을 실행하지 않고 지나게 되면 성공 Routine으로 이동시켜주는 것을 확인할 수 있으며 즉 마지막 JMP 문 바로 위부터 Serial을 확인하는 구간이 있음을 예측할 수 있다.
· Serial 확인
◦ Serial을 확인하는 구간은 위 같이 표시되며 명령어 세 가지(MOVSX, AND, JNZ)가 반복되는 것을 알 수 있다.
◦ 반복구간을 정리해보면 MOVSX로 Serial의 한 글자씩 EAX에 복사 후 AND 연산을 진행해 0이 되면 비교를 계속 진행하고 0이 되지 않으면 실패 Routine으로 바로 이동시킨다.
◦ 여기서 AND 연산은 이진법으로 연산하기 때문에 AND 연산 후 0을 만들어 주기위해서는 이진법으로 표시 후 정반대의 숫자를 만들어줘야 AND 연산 후 0을 결과물로 얻을 수 있다.
◦ AND 연산을 통한 Serial 추출
▹ 0AD
▸ 이진법 표현 : 10101101
▸ 필요 이진수 : 01010010
▸ 필요 이진수의 16진법/문자 : 0x52 / R
▹ 9A
▸ 이진법 표현 : 10011010
▸ 필요 이진수 : 01100101
▸ 필요 이진수의 16진법/문자 : 0x65 / e
▹ 97
▸ 이진법 표현 : 10010111
▸ 필요 이진수 : 01101000
▸ 필요 이진수의 16진법/문자 : 0x68 / h
▹ 0BF
▸ 이진법 표현 : 10111111
▸ 필요 이진수 : 01000000
▸ 필요 이진수의 16진법/문자 : 0x40 / @
▹ 5FC5
※ 이 비교 구간은 함정이 존재하는데 5FC5는 4Byte지만 여기서 비교되는 글자는 MOVSX로 2글자만 복사했기 때문에 2Byte로 C5만 비교대상이 된다.
▸ 이진법 표현 : 11000101
▸ 필요 이진수 : 00111010
▸ 필요 이진수의 16진법/문자 : 0x3A / :
▹ 0D6
▸ 이진법 표현 : 11010110
▸ 필요 이진수 : 00101001
▸ 필요 이진수의 16진법/문자 : 0x29 / )
▹ 결과
▸ Serial : Reh@:)
◦ 가장 마지막 부분의 'CMP ECX,6' 부분은 글자 수를 확인하기위한 명령어이다.
- Answer
· Serial : Reh@:)
'Reversing > Simples Creckme' 카테고리의 다른 글
Simples Crackme 10 (0) | 2015.08.16 |
---|---|
Simples Crackme 9 (0) | 2015.08.16 |
Simples Crackme 7 (0) | 2015.08.16 |
Simples Crackme 6 (0) | 2015.08.16 |
Simples Crackme 5 (0) | 2015.08.16 |