본문 바로가기
Wargame Write-Up/Reversing.kr

[Reversing.kr] (Reversing) Easy Crack 풀이

by snwo 2020. 3. 18.

제를 눌러 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