본문 바로가기
Security/Reversing

[Reversing.kr] Easy Keygen

by 단월໒꒱ 2022. 7. 2.

 

 

파일을 받아준다.

 

파일을 받아서 압축을 풀어주면 exe 실행파일 하나와 txt 텍스트파일 하나가 들어있다.

 

ReadMe라는 이름을 가진 텍스트 파일을 열어보자.

 

 

 

 

Serial이 5B134977135E7D13일 때의 이름을 찾으라고 한다.

 

이번에는 실행파일을 열어보았다.

 

 

 

 

이런 식으로 Name과 Serial을 입력하라고 뜬다.

 

 

일단 Exeinfo에 파일을 올려보았다.

 

 

 

 

C++로 만들어졌고 패킹되지 않은 상태이다. 특별히 볼만한 사항은 없는 것 같다.

 

바로 OllyDbg로 열어 문자열을 검색해보았다.

 

 

 

 

Correct와 Wrong이 눈에 띄는데 그쪽으로 이동해주자.

 

 

 

 

위쪽에서 또 값을 비교하고 있는데 어떻게 되는 알고리즘인지 아직 파악이 안되기 때문에 더 위쪽으로 가서 Name을 입력받는 부분을 보기로 했다.

 

Input Name과 Input Serial 부분에 BP를 걸어주고 디버깅을 시작해보자.

 

 

 

 

Name에는 임의로 ABCD를 입력해주었다.

 

다시 실행시켰다.

 

 

 

 

Input Serial 부분에서 멈춘 것을 볼 수 있다.

 

 

 

 

그리고 도중에 보면 ESI와 EDI에 51627354가 저장되어 있는데, 이 값을 Serial에 넣어보았다.

 

 

 

 

ABCD라는 Name에 Serial 값이 저게 맞다고 한다.

 

그 과정에서 루프문을 도는 것을 발견했는데 루프문은 다음과 같다.

 

 

 

 

그래서 이 루프문을 통해서 Serial 값이 결정되나 싶어서 다시 한번 디버깅을 했는데 위의 루프문이 시작되기도 전에 이미 Serial 값이 생성되는 것을 발견했다.

 

 

 

 

REP STOS DWORD PTR ES: [EDI] 기점에서 Serial 값이 EDI에 저장되었다.

 

REP STOS가 낯설어서 명령어를 찾아보았는데 

 

REP : ECX 레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX의 값만큼 반복하겠다는 명령어. (한번 수행할 때마다 ECX는 1씩 감소)

STOS : EAX의 값을 EDI가 가리키는 주소에 저장

 

그렇다고 한다.

 

따라서

REP STOS : ECX 레지스터에 있는 카운트 값만큼 STOS를 수행한다는 것이다.

 

아무튼 그러면 Serial 값은 이보다 더 위쪽에서 생성되는 것 같아서 위쪽을 살펴보는데, 위에도 루프문이 있었다.

 

 

 

 

디버깅을 해보니까 이 루프문을 통해 Serial 번호가 생성되고 있었다.

 

 

 

 

이제 루프 안쪽을 살펴보자.

 

 

 

 

제일 처음 ECX와 EDX를 XOR 연산을 하는데, 그 위를 보면 ECX에는 입력한 name의 첫번째 글자가, EDX에는 0x10이 들어감을 알 수 있다. 둘이 XOR 연산해서 나온 값을 ECX에 저장하고 PUSH해준다.

 

이 과정을 입력 받은 name의 길이만큼 반복해주는데, 결국 요약하면 다음과 같다.

 

name에 ABCD를 입력했을 때,

A와 0x10을 xor한 값을 저장하고, B와 0x20을 xor한 값을 저장하고, C와 0x30을 xor한 값을 저장하고, D와 0x10을 xor한 값을 저장하고... 이런 과정을 거쳐서 Serial 번호가 생성되는 것이다.

 

따라서 결국에 name의 각 자리별로 0x10, 0x20, 0x30이랑 xor한 값을 2자리씩 끊어서 구해준 게 Serial 값이라는 것이다.

 

그러면 Serial 값이 5B134977135E7D13이 되려면 2개씩 끊어서 역으로 연산해주면 이 때의 name을 구할 수 있을 것 같다.

 

  Hex 값
Serial 값 5B 13 49 77 13 5E 7D 13
역으로 연산한 결과 4B 33 79 67 33 6E 6D 33

 

 

최종적으로 얻은 4B 33 79 67 33 6E 6D 33를 문자열로 변환하면 K3yg3nm3이 나온다.

 

 

 

 

따라서 답은 K3yg3nm3이다.

 

 

 

 

 

댓글