본문 바로가기

0x00 /0x03 Challenge

- Reversing.kr Challenge (2) Easy KeygenMe

# Reversing.kr    100점짜리 문제인 Easy KeygenMe 문제 풀이입니다.




1. 우선 어떤 문제인지 살펴보도록 하겠습니다.


- ReadMe.txt 파일이 주어지고, 내용은 보시는 것과 같습니다. Serial 값이 "5B134977135E7D13"이 되는 

   Name 명을 찾는 것입니다.

- 임의의 Name 명을 주고, 주어진 Serial 값을 입력했더니 "Wrong" 이라는 문자를 출력하고 종료되었습니다.




2. 디버깅을 하기에 앞서 주어진 KeygenMe의 동작 흐름을 추측해보겠습니다.

- 조금만 생각해보면, 이 키젠미 프로그램의 실행 흐름을 추측할 수 있습니다.

- 정확하진 않지만, 다음과 같은 흐름으로 진행될것으로 추측됩니다.

 

  (1) 사용자에게 Name 값을 입력 받는다.

 

  (2) 사용자에게 입력 받은 Name 값을 이용해서, 어떠한 알고리즘을 통해 Serial 값을 생성한다.

 

  (3) 생성한 Serial 값을 주어진 Serial 값과 비교한다. 맞을 경우 해당 Serial 값을 생성할때 이용된 

       Name 값을 비교한다.

      혹은 Serial 값을 비교하기전에 Name 값을 먼저 비교, 일치할 경우 Serial 값을 비교한다.

      결론적으로, 프로그램 내에서 지정해두었던 Name 값과 Serial 값을 비교하여 둘다 일치할 경우 

      "Correct!" 문자를 출력, 그렇지 않을 경우에는 "Wrong" 문자를 출력하며 종료된다.




3. 올리디버거를 이용해서 디버깅해보도록 하겠습니다.

- 저같은 경우, 가장 먼저 확인하는게 참조된 Text Strings 들이 어떤것이 있는지를 살펴보는 것입니다.


- 이렇게 보면 대충 어느 부분을 봐야할지 감이 잡히고, 그 주소로 이동해서 그 주위 부분을 디버깅해보는게 

  좀 더 빠르게 풀 수 있는 방법이 아닐까 합니다.




4. "Input Name: " 이라는 문자열이 참조되는 0040102E 부터 살펴보도록 하겠습니다.


- 사용자로부터 입력을 받는 부분입니다.


- 마지막 0040105E 주소부분을 보면 사용자로 부터 입력 받은 문자열이 존재하는 주소를 EDI에 넣는 것을 확인할 수 있습니다.




- 그 아래 코드 부분입니다. 레지스터들을 초기화하고, 입력한 문자열의 길이를 구하는 것을 확인할 수 있었습니다.





- 위의 루프는 사용자가 입력한 글자수만큼 루프를 돌면서 0x10 0x20 0x30 순으로 사용자 입력한 문자와 차례대로 XOR 연산을 합니다.

- 연산한 결과를 "0018FE88"의 위치에 저장을 합니다.





- YOKANG 이라는 Name을 입력했을 때 생성된 Serial 값이 "496F7B516E77" 입니다.

- Name 값에 따른 Serial 값 생성 방법이 확실한지 확인해보도록 하겠습니다.





- 보시는 것 처럼 YOKANG 이라는 Name으로 생성된 Serial 값은 "496F7B516E77"로 

  Serial 값 생성 방법은 앞에서 설명한 방법이 확실한 것으로 확인이 되었습니다.



# 주어진 문제는 "5B134977135E7D13"이라는 Serial 값을 생성해내는 Name 값을 찾는 것입니다.

   Name 값으로 0x10, 0x20, 0x30 값을 이용하여 XOR 연산하여 나온 결과들을 나열한 것이 Serial 값이 되므로

   역으로 Serial 값에서 0x10, 0x20, 0x30으로 다시 XOR 연산을 해주면, 그 값(아스키코드값)이 바로 우리가 찾던

   Name 값이 되는 것입니다.




5. 역으로 XOR 연산을 해서 Name 값을 구하도록 하죠.

                                        아스키코드로 변환

  (1) 5B XOR 0x10    = 4B        ->    K

  (2) 13 XOR 0x20    = 33        ->    3    

  (3) 49 XOR 0x30    = 79        ->    y

  (4) 77 XOR 0x10    = 67        ->    g

  (5) 13 XOR 0x20    = 33        ->    3

  (6) 5E XOR 0x30    = 6E        ->    n

  (7) 7D XOR 0x10    = 6D        ->    m

  (8) 13 XOR 0x20    = 33        ->    3


# 결론적으로 저희가 찾던 "5B134977135E7D13" Serial 값의 Name은 "K3yg3nm3"이 되는 것입니다.