lena tutorial 1, 2
lena tutorial은 리버스 엔지니어링을 연습하기 좋은 문제들로 구성되어 있어 많은 학습자들이 애용하는 자료이다.
튜토리얼을 실행하면 Evaluation period out of date. Purchase new license
메시지 창이 실행되는 것을 확인할 수 있다. 디버깅 도구를 이용하여 디스어셈블리를 확인해보면 “Keyfile.dat” 파일을 읽으려 한다는 것을 알 수 있다.
CODE:0040105C push 0 ; hTemplateFile
CODE:0040105E push offset unk_40216F ; dwFlagsAndAttributes
CODE:00401063 push 3 ; dwCreationDisposition
CODE:00401065 push 0 ; lpSecurityAttributes
CODE:00401067 push 3 ; dwShareMode
CODE:00401069 push 0C0000000h ; dwDesiredAccess
CODE:0040106E push offset FileName ; "Keyfile.dat"
CODE:00401073 call CreateFileA
CODE:00401078 cmp eax, 0FFFFFFFFh
CODE:0040107B jnz short loc_40109A
CODE:0040107D push 0 ; uType
CODE:0040107F push offset Caption ; " Key File ReverseMe"
CODE:00401084 push offset Text ; "Evaluation period out of date. Purchase"...
CODE:00401089 push 0 ; hWnd
CODE:0040108B call MessageBoxA
CODE:00401090 call ExitProcess
Keyfile.dat 파일이 없는 경우 -1을 반환하므로 0040107B
에서 다음 로직으로 이동하지 못하고 메시지 창 출력 후 프로세스를 종료하는 것을 확인할 수 있다. Keyfile.dat 파일 생성 후 다시 진행해보자.
Keyfile is not valid. Sorry.
문구를 출력하고 프로세스가 종료되는 것을 확인할 수 있다. 조금 더 살펴보면 이번 튜토리얼의 목적인 You really did it! Congratz !!!"
메시지 창을 출력하는 코드를 만날 수 있다. 어떻게 하면 성공 코드에 도달할 수 있을까.
CODE:004010A9 call ReadFile
CODE:004010AE test eax, eax
CODE:004010B0 jnz short loc_4010B4
CODE:004010B2 jmp short loc_4010F7
CODE:004010B4
CODE:004010B4 loc_4010B4: ; CODE XREF: start+B0↑j
CODE:004010B4 xor ebx, ebx
CODE:004010B6 xor esi, esi
CODE:004010B8 cmp ds:NumberOfBytesRead, 10h
CODE:004010BF jl short loc_4010F7
CODE:004010C1
CODE:004010C1 loc_4010C1: ; CODE XREF: start+D1↓j
CODE:004010C1 mov al, ds:byte_40211A[ebx]
CODE:004010C7 cmp al, 0
CODE:004010C9 jz short loc_4010D3
CODE:004010CB cmp al, 47h
CODE:004010CD jnz short loc_4010D0
CODE:004010CF inc esi
CODE:004010D0
CODE:004010D0 loc_4010D0: ; CODE XREF: start+CD↑j
CODE:004010D0 inc ebx
CODE:004010D1 jmp short loc_4010C1
CODE:004010D3
CODE:004010D3 loc_4010D3: ; CODE XREF: start+C9↑j
CODE:004010D3 cmp esi, 8
CODE:004010D6 jl short loc_4010F7
CODE:004010D8 jmp loc_401205
4010F7
으로 이동 시 실패, 401205
으로 이동 시 성공이다. 첫 번째로 004010B8
의 cmp ds:NumberOfBytesRead, 10h
를 만족하기 위해서 Keyfile.dat 파일은 16자리 이상으로 구성되어야 한다. 두 번째로 004010D3
의 cmp esi, 8
를 만족하기 위해서 ‘G’가 8개 이상(004010CB
의 cmp al, 47h
) 포함되어야 한다. 004010C7
의 cmp al, 0
로 확인하여 null 일 시 비교를 시작하므로 GGGGGGGGGGGGGGGG
를 Keyfile.dat에 저장하면 You really did it! Congratz !!!"
메시지 창이 출력되는 것을 확인할 수 있다.