ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [reversing.kr] Easy Keygen 풀이
    Wargame/reversing.kr 2020. 12. 9. 11:16

    reversing.kr의 두 번째 문제다. 나름 꼼꼼하게 풀어보려고 다양한 시도를 해봤지만 도저히 감이 안 와서 다른 분들의 풀이를 참고하였다.

     

    1. 프로그램 실행

    해당 프로그램은 콘솔형태의 프로그램으로 클릭하여 실행하면 바로 결과를 출력하고 콘솔 창이 사라져 버린다. Powershell로 프로그램을 실행해보자.

     

    실행 화면

    사용자로부터 Name과 Serial을 input으로 받고 결과를 출력한다. 각각 'maple19out', 'maple19out'을 입력하였지만 조건을 만족하지 않아서 Wrong을 출력한다. 같은 폴더에 있는 ReadMe.txt를 읽어보자.

     

    ReadMe.txt

    결과적으로는 어떠한 Serial Key가 5B134977135E7D13인 Name을 찾아 홈페이지에 Auth를 해야 점수를 받을 수 있다. 본격적으로 디버깅을 해보자.

     

    2. Debugging (with x32dbg)

    우선 "Input" 문자열을 참조하는 부분을 찾아가 보자.

    Input 문자열 참조 부분

    코드는 위와 같다. 40102E를 통해 push 408060 ("Input Name: " 이 저장된 주소)를 스택에 쌓고 첫 번째 화살표로 표시한 부분에서 printf기능을 하는 함수를 호출한다. 바로 위에 있는 세 개의 mov 연산이 수상하기는 하지만 일단 넘어가자. 또한 두 번째 화살표에서는 이름을 입력받는 scanf기능을 하는 함수를 호출하는 것을 확인할 수 있다. 해당 부분을 수행한 직후 [esp+18]에 무엇이 저장되어 있는지 dump 창에서 따라가 보자.

     

    esp+18 dump 창

    위와 같이 입력으로 설정한 maple19out이 저장되어 있는 것을 확인할 수 있다. 계속해서 코드를 실행시키다 보면 다음과 같은 함수가 나타나는 것을 확인할 수 있다.

     

    0040109A

    해당 함수가 수행되기 전에 ecx를 스택에 쌓게 되는데, 위 연산에서 ecx에는 esp+7C의 주소가 담긴다. 수행 직후에 esp+7C의 dump창을 확인해보자.

     

    첫 serial key...?

    위와 같이 serial key 냄새를 풍기는 값이 dump창에 나타났다. 위의 함수에 bp를 설정하고 F9를 연타해보자.

     

    serial key

    위와 같은 값들이 저장된 후, Serial input을 요구한다. 이 값을 한 번 입력해보자.

     

    Correct!

    크랙 성공! 하고 마무리하면 좋겠지만 문제의 조건은 어떠한 serial key 값을 주고 그 serial key를 생성하는 Name을 찾는 것이다. 따라서 Serial key 생성 알고리즘을 파악해야 한다. 여기서부터 엄청난 삽질이 시작되었다. 함수 하나하나 따져보면서 모르는 어셈블리 명령어는 찾아보고 bp 설정하고 해도 큰 흐름을 파악할 수 없었다... Serial Key가 Name 하나당 2개의 key씩 생성된다는 점 등등의 규칙을 찾아보았지만 문제를 풀기는 어려웠다. 풀이를 찾아보니 반복문이 있다는 부분에 착안하여 코드를 다시 살펴보았다.

     

    문제의 핵심

    왼쪽 분기선을 보면 알겠지만, ecx동안 loop가 돌아가는데 esi 값을 주목해야 한다. loop 표시 아래에 있는 movsx의 연산으로 ecx, edx 레지스터에 어떠한 값이 들어가는데 ecx는 위에서 말했던 수상한 mov, 즉 0x10, 0x20, 0x30이 반복하면서 들어가고, edx에는 name의 각 문자가 들어간다. 다음 xor 연산을 해주고 그 결과가 0040109A의 함수 호출로 Serial Key가 저장된다. 간단히 나타내면 다음과 같다.

     

    (1) 'm'(Name의 첫 번째 문자)와 0x10을 XOR연산 (0x6D ^ 0x10 = 0x7D)

    (2) 7D를 serial key 주소에 저장

    (3) 'a'(Name의 다음 문자)와 0x20을 XOR 연산 (0x61 ^ 0x20 = 0x41)

    (4) 41을 serkal key 주소에 저장

    (5) 'p'(Name의 다음 문자)와 0x30을 XOR 연산 (0x70 ^ 0x30 = 0x40)

    (6) 40을 serial key 주소에 저장

    (7) (1) ~ (6)을 반복

     

    즉 문제 해결을 위해서는 입력 Name 문자열에 0x10, 0x20, 0x30을 각각 XOR연산한 결과가 "5B134977135E7D13"인 Name을 찾아야 한다. 한편 XOR 연산은 두 번 적용했을 때 복호화하기 이전 값으로 돌아가는 성질이 있다. (A ^ X ^ X = A) 따라서 Serial Key에 1020301020301020 을 XOR해주면 본래 Name의 hex값이 나오고, 해당 값을 ASCII 코드로 변환하면 Name을 찾을 수 있다. K3yg3nm3을 입력하면 원하는 Serial Key 값이 생성된다.

     

    크랙 성공

     

    이번 문제를 풀면서 코드 하나하나 분석하는 능력도 중요하지만 큰 흐름을 파악하는 쪽으로도 코드 보는 연습을 해야겠다는 점을 느꼈다.

    반응형

    'Wargame > reversing.kr' 카테고리의 다른 글

    [reversing.kr] Music Player 풀이  (0) 2021.02.09
    [reversing.kr] ransomware 풀이  (0) 2021.01.08
    [reversing.kr] Easy ELF 풀이  (0) 2021.01.05
    [reversing.kr] Easy Unpack 풀이  (0) 2020.12.13
    [reversing.kr] Easy Crack 풀이  (0) 2020.12.07

    댓글

Designed by Tistory.