문제를 눌러 Easy_CrackMe.exe 파일을 다운받자.
일단 die ( Detect It Easy ) 로 열어보면,
32bit 파일임을 알 수 있다.
비밀번호를 입력하는칸과, 확인 버튼이 있는걸 알 수 있다.
ollydbg 로 문자열을 찾아 클릭한 후, 함수에 BP를 걸어 실행시켜보자.
확인을 눌렀을때, 우리가 입력한 값을 검사하는 함수가 실행된다.
[ 분석 ]
00401094 |. 6A 64 PUSH 64 ; /MaxCount = 100.
00401096 |. F3:AB REP STOS DWORD PTR ES:[EDI] ; |
00401098 |. 66:AB STOS WORD PTR ES:[EDI] ; |
0040109A |. AA STOS BYTE PTR ES:[EDI] ; |
0040109B |. 8B7C24 70 MOV EDI,DWORD PTR SS:[ESP+70] ; |
0040109F |. 8D4424 08 LEA EAX,[ESP+8] ; |
004010A3 |. 50 PUSH EAX ; |String => OFFSET LOCAL.24
004010A4 |. 68 E8030000 PUSH 3E8 ; |ItemID = 1000.
004010A9 |. 57 PUSH EDI ; |hDialog => [ARG.1]
004010AA |. FF15 9C504000 CALL DWORD PTR DS:[<&USER32.GetDlgItemTe ; \USER32.GetDlgItemTextA
004010B0 |. 807C24 05 61 CMP BYTE PTR SS:[ESP+5],61
#ESP+4 가 첫번째글자니까, str[0] 이라 지칭할께요.
우리가 입력한 문자열을 가져와서, str[1] == 0x61 ( a ) 인지 비교.
004010B7 |. 6A 02 PUSH 2 ; /Arg3 = 2
004010B9 |. 8D4C24 0A LEA ECX,[ESP+0A] ; |
004010BD |. 68 78604000 PUSH OFFSET 00406078 ; |Arg2 = ASCII "5y"
004010C2 |. 51 PUSH ECX ; |Arg1
004010C3 |. E8 88000000 CALL 00401150 ; \Easy_CrackMe.00401150
004010C8 |. 83C4 0C ADD ESP,0C
004010CB |. 85C0 TEST EAX,EAX
004010CD |. 75 66 JNZ SHORT 00401135
str[2] 부터 5y 와 비교. ( str[2] == '5' , str[3] == 'y' )
004010CF |. 53 PUSH EBX
004010D0 |. 56 PUSH ESI
004010D1 |. BE 6C604000 MOV ESI,OFFSET 0040606C ; ASCII "R3versing"
004010D6 |. 8D4424 10 LEA EAX,[ESP+10]
004010DA |. 8A10 /MOV DL,BYTE PTR DS:[EAX]
004010DC |. 8A1E |MOV BL,BYTE PTR DS:[ESI]
004010DE |. 8ACA |MOV CL,DL
004010E0 |. 3AD3 |CMP DL,BL
004010E2 |. 75 1E |JNE SHORT 00401102
004010E4 |. 84C9 |TEST CL,CL
004010E6 |. 74 16 |JZ SHORT 004010FE
004010E8 |. 8A50 01 |MOV DL,BYTE PTR DS:[EAX+1]
004010EB |. 8A5E 01 |MOV BL,BYTE PTR DS:[ESI+1]
004010EE |. 8ACA |MOV CL,DL
004010F0 |. 3AD3 |CMP DL,BL
004010F2 |. 75 0E |JNE SHORT 00401102
004010F4 |. 83C0 02 |ADD EAX,2
004010F7 |. 83C6 02 |ADD ESI,2
004010FA |. 84C9 |TEST CL,CL
004010FC |.^ 75 DC \JNZ SHORT 004010DA
push * 2 로 esp - 8 이 되었으니, [ESP + 0x10 - 8] == [ESP+8],
str[4] 부터 R3versing 과 2글자씩 비교.
0040110D |. 807C24 04 45 CMP BYTE PTR SS:[ESP+4],45
00401112 |. 75 21 JNE SHORT 00401135
00401114 |. 6A 40 PUSH 40
00401116 |. 68 58604000 PUSH OFFSET 00406058 ; ASCII "EasyCrackMe"
0040111B |. 68 44604000 PUSH OFFSET 00406044 ; ASCII "Congratulation !!"
00401120 |. 57 PUSH EDI
00401121 |. FF15 A0504000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>
00401127 |. 6A 00 PUSH 0 ; /Result = 0
00401129 |. 57 PUSH EDI ; |hDialog
0040112A |. FF15 A4504000 CALL DWORD PTR DS:[<&USER32.EndDialog>] ; \USER32.EndDialog
마지막으로 str[0] == 0x45 ('E') 인지 비교 후, Congratulation! 출력
[ 최종 문자열 ]
str[0]='E'
str[1]='a'
str[2~3]='5y'
str[4~12]='R3versing'
str = Ea5yR3versing
str = Ea5yR3versing