728x90
  • Easy_Keygen

 

 

Reversing.Kr 사이트에서 Easy Keygen 예제를 풀어보려 한다. 문제 파일을 다운 받으면, exe 실행파일과 메모장을 얻을 수 있다.

 

 

메모장을 먼저 열게 되면 시리얼 번호 5B134977135E7D13 일 때의 name을 찾는 예제로 실행파일을 실행했을 때 맞는 name이 아닌 경우에 wrong 을 출력하고 종료하는 것을 확인 할 수 있다.

 

 

 

올바른 name을 찾기 위해서는 어떻게 해야할까?? 먼저 ollydbg에 들어가 실행파일을 열어 보았다.

 

 

 

name 값을 알아내려면 먼저 correct 와 wrong 이 출력되는 부분을 보면 단서가 나오지 않을까 하는 생각에 코드를 찾아 봤다. correct가 출력되는 줄 전에 jmz 명령어는 것을 보고 어딘가 name을 비교하고 점프해서 값을 출력하는 구조일 것이라 추측할 수 있었다.

 

 

 

그렇다면 name을 받는 부분을 살펴보자. name을 받는 부분에 브레이크포인트를 걸고 임의 name으로 abcd 를 입력해 주었더니 EDI에 abcd가 들어가는 것을 확인 할 수 있다. 하지만 확연하게 name을 어떻게 얻는지는 아직까지는 잘 모르겠다.

 

 

그 후 계속 진행하며 아래에 가니 loop 문을 발견했고 그 아래에 movsx 명령어로 ECX, EDX 에 값이 들어가게 되는데 이 값들은 name을 받고 나서 나왔던 mov 0x10, 0x20, 0x30 이 반복해서 들어가게 된다. 그 후 xor 연산으로 ECX 값이 EDX로 들어가게 된다. 

 

지금까지의 이해로 풀이를 하였을 때, 문제 해결을 위해서는 입력 Name 문자열에 0x10, 0x20, 0x30을 각각 XOR연산한 결과가 "5B134977135E7D13"인 Name을 찾을 수 있다는 것이다. xor 연산을 하게 되면 name을 알수 있다.

 

 

 K3yg3nm3 

 


  • reversing_me

 

이 예제에서 주어진 코드를 분석하면, 입력받은 값의 길이와 serial 값의 길이가 53바이트로 같으면 if문을 i<strlen(serial) && (enter[i]^(0,1,0,1, ...))==serial[i]일 때까지 반복한다. 코드에서 ^가 나오는 걸 보고 구글링해봤더니 xor 연산자라고 한다. 

 

그렇다면, serial 값을 xor 연산을 통해서 키 값을 얻으면 되지 않을까? flag 값을 구하는 코드를 작성했다.

#include <stdio.h>
#include <string.h>
 
int main() {
    char* serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}";
    
    for (int i = 0; i < strlen(serial); i++)
        printf("%c", serial[i] ^ (i % 2));
}

 

결과는 flag 값을 얻을 수 있었다!

 

+ Recent posts