본문 바로가기

[REVERSING]/▶CrackMe

CracMe #1 Easy_KeygenMe

CracMe #1

 

[그림.1]

처음 Ollydbg에 올리면 그림1 과 같습니다. 이 부분에서 중요한부분은 401030,40103D,401042 주소에 있는 부분입니다.

 

[그림.2]

처음 사용자로부터 input name을 받기전에  [ESP+10],[ESP+11],[ESP+12] 주소로 10,20,30 순으로 BYTE단위로 값을 저장 하고있습니다.

이부분이 핵심이 되겠습니다. 자세한건 뒤에 설명하도록 하겠습니다. 

[그림.3]

Scanf 함수에 입력한 abcdefg 총7문자에 \0 널문자 포함 8바이트가 입력이 됩니다.

401070에 NOT ECX는 401062에서 에서 OR ECX,FFFFFFFF 했던것을 다시 비트를 반전시킵니다. 반전시키면 ECX에 8이 저장이되고 \0널문자를 제외해야하기때문에

401072에서 ECX레지스터의값을 -1 합니다.

 

[그림.4]

여기서 그림2에서 10,20,30 순서대로 저장했던 부분을 설명하겠습니다.

401077,40107A 주소에보면 3번 반복되게 되어있습니다. 이부분은 사용자가 입력한 문자에 순서대로 10,20,30 을 3번 반복해서 사용하도록 되어있습니다.

즉 그림4의 2번에서 40107E주소를 보면 ECX레지스터에 순서대로 입력한 첫번째 키 10을 복사합니다.

그리고 바로아래 401083에 사용자가 입력한 첫문자가 EDX 레지스터에 복사됩니다. (저는 INPUT NAME에 입력값으로 abcdefg 를 입력하였습니다.)

401088 주소를 보면 ECX레지스터와 EDX 레지스터가 XOR연산을 진행하게 되어있습니다.

즉 이키젠은 사용자가 입력한 길이를 체크하여 10,20,30을 XOR연산 하고 순서대로 연산결과를 그대로 붙여 키를 만들고있습니다.

바로아래 40109A에 보면 변환된 숫자를 연속적으로 연결하여 하나의 키를 생성하고있습니다.

그림4의 4번은 사용자가 입력한 길이만큼 반복이 되게끔 되어있습니다.

간단히 정리하면 예로 abcdefg 를 입력하면 a xor 10 =71, b xor 20 = 42, c xor 30 = 53, d xor 10 = 74 .... 순으로 연산이 이뤄집니다.

abcdefg에대한 키값은 71425374455677 되겠습니다.

 


'[REVERSING] > ▶CrackMe' 카테고리의 다른 글

reversing.kr replace  (0) 2012.06.18
CrackMe #2 Back to user 모드를 이용한 Music Player  (11) 2012.05.31