DDDDigtal 4ensics

[Reversing.kr] Easy Keygen 문제풀이 본문

Reversing

[Reversing.kr] Easy Keygen 문제풀이

Dx4 2023. 5. 2. 22:47

문제를 다운받으면 ReadMe와 함께 Easy Keyen이 들어있는 압축파일을 다운하게된다.

문제를 간략하게 설명하면, 저 시리얼값에 응하는 Name을 찾아라! 라는 역연산문제이다.

 

뭐 바로 시작해보자.

cpp로 짜였고, 아무런 패킹도 없고 엔트리 포인트를 알 수 있다. 풀기 전 언제나 exeinfo로 확인해보는 습관을 들인다면

크게 나쁘지 않은 습관이 될 것 이다.

 

엔트리 포인트까지 진입한 화면이다. 바로 일단 인풋까지 가보겠다.

일단 Input은 123456789로 값을 넘기겠다.

0040105E주소에서 edi에 우리가 Input Name:에 입력했던 값이 들어있는 주소를 넣는다.

 

0040105E | 8D7C24 18                | lea edi,dword ptr ss:[esp+18]           |
00401062 | 83C9 FF                  | or ecx,FFFFFFFF                         | ecx:&"\n\n"
00401065 | 33C0                     | xor eax,eax                             |
00401067 | 83C4 08                  | add esp,8                               |
0040106A | 33ED                     | xor ebp,ebp                             |
0040106C | 33F6                     | xor esi,esi                             | esi:EntryPoint
0040106E | F2:AE                    | repne scasb                             |
00401070 | F7D1                     | not ecx                                 | ecx:&"\n\n"
00401072 | 49                       | dec ecx                                 | ecx:&"\n\n"
00401073 | 85C9                     | test ecx,ecx                            | ecx:&"\n\n"

00401062주소에서 ecx와 FFFFFFFF을 or연산을 한다. 즉, ecx를 FFFFFFFF로 값을 셋팅한다.

00401065주소에서 eax와 자기자신을 xor연산을 한다. 즉, eax를 0으로 값을 셋팅한 것과 같다.

0040106E주소에서 repne scasb라는 레지스터가 보이는데 repne scasb는 ecx와 같이 사용되며, 주로 문자열과 관련되어 많이 사용된다. repne scasb에서 FFFFFFF5라는 값을 완성시키고, 그 밑 not ecx를 통해 10이라는 값을 만들어준다.

그리고 그 밑에 dec ecx에서 null값을 제거하여 9라는 값을 완성시키는 것 이다.

 

자 이제 본격적으로 어떻게 시리얼값을 뱉어내는지 분석해보자

00401077주소부터 반복문이 시작된다.

0040107E | 0FBE4C34 0C              | movsx ecx,byte ptr ss:[esp+esi+C]       |
00401083 | 0FBE542C 10              | movsx edx,byte ptr ss:[esp+ebp+10]      |
00401088 | 33CA                     | xor ecx,edx                             |

이 부분이 핵심 부분이다. 0040107E주소에서ESP+ESI + C의 주소를 덤프에서 계속 주시하며 반복문을 돌려보면

10 -> 20 -> 30 -> 10 ····· 로 반복되는 걸 볼 수 있다.

00401083주소에서는 계속해서 edx에 우리가 입력했던 값의 문자 하나 하나를 넣고 있고,

 

이걸 연산해본다면 0x31^0x10 -> 0x32^0x20 -> 0x033^0x30 -> 0x34^0x10 ····를 반복하는 것 이고, 이걸 코드로 짜본다면

public class Main {

	public static void main(String[] args) {
		
		char[] Serial = {0x5B,0x13,0x49,0x77,0x13,0x5E,0x7D,0x13};
		char edx = 0x10;
		
		for(int i = 0; i < Serial.length;i++) {
			if(edx > 0x30) {
				edx = 0x10;
			}
			System.out.print((char)(Serial[i] ^ edx));
			edx += 0x10;
		}
	}
	
}

라는 코드가 나올 것 이고, 결과 값은 K3yg3nm3이 나올 것 이다. 그렇기에 flag는 K3yg3nm3이다.

'Reversing' 카테고리의 다른 글

레나 튜토리얼 - 04 풀이  (0) 2024.02.15
레나 튜토리얼 - 03 풀이  (1) 2024.02.12
레나 튜토리얼 - 01 풀이  (1) 2024.02.12
[Reversing.kr] Music_Player 문제풀이  (0) 2023.05.05
[Reversing.kr] Easy_CrackMe 문제풀이  (1) 2023.04.30