본문 바로가기

Reversing/Simples Creckme

Simples Crackme 8

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