codediver라는 분이 만드신 크랙미 같은데 아는분이 주셔서 한번 풀어봤어요 ㅎ

간단하니 가벼운 마음으로 봅시당 ㅎ



프로그램은 이렇게 생겼습니다.

Ok 버튼을 눌러도 아무런 반응도 하지 않는 아주 배은망덕(?) 한 프로그램인데요(다이버님 죄송 ㅠ)

무엇으로 만들어졌나 스캔해 봤더니..



헐!! 보이시나요?? 전 분석하기도 어려워 죽을꺼 같은 어셈으로 코딩까지 하셨네요 ㅠㅠ

이제 올리로 프로그램을 하나하나 분석해 봅시당 ㅎ

코드는 그렇게 길지 않습니다.

쭈욱 내리다 보면...

아래와 같은 부분이 보입니당.



사진 맨위를 보시면 CMP문으로 AX의 값과 셋팅되어있는 10(10진수로 16)을 비교하네요.

AX는 트레이싱 해보시면 아시겠지만 사용자가 입력한 값의 길이 입니다.

길이가 16이여야 엉뚱한 곳으로 점프하지 않고 아래에 있는 코드들이 실행되겠네요.

코드가 조금 긴 관계로 바로 분석하겠습니다.(중요한 부분만)


CMP AX,10                                                                                    //글자 길이가 16글자인지 비교.
JNZ SHORT dummycod.00401229                                                     // 16글자가 아니라면 다른곳으로 점프
MOV ECX,EAX                                                                               // EAX는 문자열 길이가 저장되어 있다. 그 값을 ECX에 복사함.
MOV ESI,dummycod.00403078                                                         // 사용자 입력 값을 ESI에 복사함.
MOV EDI,dummycod.00403035                ;  ASCII "$2667;/1722\"4;29" // xor할 문자열을 EDI에 복사함.
JMP SHORT dummycod.004011E4
DB 2F                                    ;  CHAR '/'
DB 33                                    ;  CHAR '3'
MOV BL,BYTE PTR DS:[ESI]                                                         // 사용자가 입력한 값들중 맨 처음 앞글자를 BL에 복사함.
JMP SHORT dummycod.004011EA
DB 37                                    ;  CHAR '7'
DB 22                                    ;  CHAR '"'
MOV AL,BL                                                                                  // BL의 값을 AL에 복사함.
JMP SHORT dummycod.004011F0
DB 2D                                    ;  CHAR '-'
DB 39                                    ;  CHAR '9'
MUL BL                                                                                       // BL과 AL값을 곱하여 AL에 저장.
ADD BL,BL                                                                                   // BL값에 BL을 더함.
OR BL,BL                                                                                     // BL에 BL을 OR 연산함(값이 변동하지 않음)
JNZ SHORT dummycod.004011FA
JMP SHORT dummycod.00401229
JMP SHORT dummycod.004011FE
DB 31                                    ;  CHAR '1'
INC ESP
DIV BL
JMP SHORT dummycod.00401204
DB 87
POP ESI                                  ;  kernel32.7C7E7077
MOV BL,BYTE PTR DS:[EDI]                                                          // EDI 한바이트를 BL에 복사.
JMP SHORT dummycod.0040120A
DB 2F                                    ;  CHAR '/'
DB 33                                    ;  CHAR '3'
CMP AL,BL                                                                                   // 계산된 AL과 BL에 값을 비교함.
JMP SHORT dummycod.00401210
DB 31                                    ;  CHAR '1'
INC EBP
JNZ SHORT dummycod.00401229                                                    // AL과 BL이 같지 않으면 점프(그러므로 분석할때는 NOP해줘야 한다.)
INC ESI                                                                                        // ESI를 1증가 시킨다.(다음글자로 넘어감.)
INC EDI                                  ;  ntdll.7C940228                               // EDI를 1증가 시킨다.(다음글자로 넘어감.)
LOOPD SHORT dummycod.004011E0                                              // 루프 ^^ (16번을 돈다.)
PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
PUSH dummycod.0040300F                   ; |Title = "Http://codeDiver.gg.ro"
PUSH dummycod.00403046                   ; |Text = "성공하셨네요! 멋진 리버서가 되시길"
PUSH 0                                   ; |hOwner = NULL
CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA      // 메시지 박스 호출.

 
휴 저도 완벽히 분석은 못해서.. ㅠㅠ

CMP AL,BL 이부분이 성립되어야 메시지 박스로 넘어갑니다.

AL에는 연산된 결과값이 있고 BL에는 비교 대상인 $2667;/1722"4;29 문자열에 $가 들어가게 됩니다.(첫번째 루프에서)

역으로 비교 문자열을 입력하면 답이 나오지 않을까요?(xor)



$2667;/1722"4;29을 넣고 트레이싱을 하면 BL에 H글자가 들어가는 것을 확인할 수 있는데요.

아직 복사 전이라 계산된 값이 BL에 들어가 있는 것 입니다.

복사가 되면 BL에는 $글자가 들어가겠죠 ㅎ

이런식으로 한글자 한글자씩 분석하시면 실제로 넣어야 할 값이 만들어집니다.

그 값을 프로그램에 입력하면 분석했던 로직으로 인해 비교될 문자열들과 똑같아 지는 것이죠.

그리고는 메시지 박스가 호출되게 되는 것 입니다.




아 분석을 한줄한줄 하다보니 귀찮아서 몇군데 건너띄었는데 양해 부탁드려요..

마지막에는 대충썼네요 ㅋㅋㅋ;;

근데 이건 크랙미라 하기도 뭐하고 키젠미라고 하기도 뭐한....

아래는 분석한 프로그램이에요 ㅎ

  1. Secret 2010.02.12 10:44

    CMP AL,BL부분이 성립되야 하니까 00401210 부분의 JNZ를 JE로 바꾸면 16자리 아무숫자나 입력해도 성공!

  2. gasinams 2010.03.02 13:31

    어렵다 이건 ㅠㅠ

+ Recent posts