Reversing

[Reversing] Easy Keygen_WirteUp

오호츠크해 기단 2023. 4. 29. 01:28
728x90

 

워게임 풀이

 

2. Easy Keygen

http://reversing.kr

Reversing.Kr

Copyright © 2012-2023 Gogil All Right Reserved.

reversing.kr

 

문제 파일 메모장을 살펴보니 Serial Key가 5B134977135E7D13인 Name을 찾아야 하는 것 같다.
 
 

실행 파일을 실행시켰더니 Name과 Serial을 입력 받고 그냥 종료된다. 아마 Name이 틀렸기 때문에 종료되는 것 같고 올바른 Name을 입력할 경우 Correct! 가 나올 것으로 예상된다!
 
 
 
올리디버거로 해당 실행 파일을 열어보았다.

초록색으로 형광펜 친 부분을 집중해서 보면, Serial 생성 루틴을 찾을 수 있다. 입력 받은 문자열을 가져와서 하나씩 0x10, 0x20, 0x30과 차례로 XOR 연산을 진행하고 있다.
 
 

[ESP+ESI+C] 안의 값을 가져오고, [ESP+EBP+10]의 값을 가져온다.
그리고
[ESP+ESI+C]에 0x10,
[ESP+EBP+10]에는 내가 입력한 첫번째 값이 들어온다.
 
 

그 둘을 XOR 해준다. 그 다음 loop에는 0x20을 [ESP+ESI+C]에...
 
 

그리고 ESI에 생성한 Serial 값을 저장하고 입력받은 Serial 값과 비교해서 일치할 경우 "Correct!"를 아닐 경우 "Wrong"을 띄우는 곳으로 점프한다.
 
 
README 메모장에서 Serial이 5B134977135E7D13이라고 알려주었으므로 아래와 같이 생각할 수 있다.

  1. 내가 입력한 값의 1번째 값과 0x10을 xor하면 0x5B가 나온다.
  2. 내가 입력한 값의 2번째 값과 0x20을 xor하여 0x13이 나온다.
  3. 내가 입력한 값의 3번째 값과 0x30을 xor하여 0x49가 나온다.
  4. 내가 입력한 값의 4번째 값과 0x10을 xor하여 0x77이 나온다.
  5. 내가 입력한 값의 5번째 값과 0x20을 xor하여 0x13이 나온다
  6. 내가 입력한 값의 6번째 값과 0x30을 xor하여 0x5E가 나온다.
  7. 내가 입력한 값의 7번째 값과 0x10을 xor하여 0x7D가 나온다.
  8. 내가 입력한 값의 8번째 값과 0x20을 xor하여 0x13이 나온다.
#include <stdio.h>

int main() {
    int serial[] = { 0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13 };
    int value[3] = { 0x10, 0x20, 0x30 };

    int count = 0;

    for (int i = 0; i < sizeof(serial) / sizeof(int); i++) {
        if (count == 2) {
            printf("%c", serial[i] ^ value[count]);
            count = 0;
        }
        else {
            printf("%c", serial[i] ^ value[count]);
            count++;
        }
    }
    return 0;
}

Seiral '5B134977135E7D13'를 거꾸로 위 계산을 거꾸로 해서 Name으로 변경하는 코드
 
 
 

위와 같은 결과가 나온다.

Name: K3yg3nm3
Serial: 5B134977135E7D13