아주 쉬운거에요..

스트링을 보면 성공 메시지가 보이지만 이건 성공메시지가 중요한 것이 아닙니다.

어떤식으로 돌아가고 있는지 풀이를 간단하게 저에게 알려주시면 합당한 상품(?)을 드릴께요.

아 오랜만에 플밍하니 머리 아프네요 ㅋㅋㅋㅋ

자주자주 해야겠어요..




컴파일 환경: XP SP3, VS 6.0

'[+] Information > [-] RCE' 카테고리의 다른 글

Lena's Tutorial 1 상세분석  (0) 2011.10.06
Lena's Tutorial 분석 글을 쓸 예정  (0) 2011.10.06
아주 쉬운 크랙미  (9) 2009.11.24
출처모르는 크랙미 풀이..  (4) 2009.11.15
POC Window 리버싱  (2) 2009.10.24
  1. Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2009.11.24 23:28 신고

    문제가 뭐 이따구니 뭐가 이렇게 쉽냐는둥 하시면 안되요~

    이건 초보자를 위한 크랙미에요 중급자 크랙미는 다음에 만들어 올릴께요 ㅋ

    분석능력을 기를수있게 만든 크랙미에요~

  2. Favicon of https://sone.tistory.com BlogIcon Sone 2009.11.24 23:50 신고

    끝에 system("pause";); 정도는 넣어주시는 센스~!

  3. 알 수 없는 사용자 2009.11.26 07:10

    그럼 끝에 getch(); 정도는 넣어주시는 센스..

  4. gasinams 2010.02.19 19:53

    관리자의 승인을 기다리고 있는 댓글입니다

  5. gasinams 2010.02.24 19:48

    관리자의 승인을 기다리고 있는 댓글입니다

  6. 익명 2010.09.04 11:47

    비밀댓글입니다

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

    어렵다 이건 ㅠㅠ



학교에서 VB 배운기념으로 강의시간에 잠깐 짬내서 만들어본 크랙미 입니다.

심심할때 풀어보시면 좋겠네요~

P.s - 정말 간단한 것입니다. 로직도 단순한 프로그램 입니다. 너무 깊게 생각하면 오히려 어려워질수 있습니다 ^^



'[+] Information > [-] RCE' 카테고리의 다른 글

MaJ3stY의 쉬운 keygenMe~  (2) 2009.04.06
리버싱 전 셋팅 간단한 팁.  (0) 2009.04.01
정말 간단한 MaJ3stY CrackMe  (7) 2009.03.31
Import REC 1.7c  (0) 2009.02.08
Universal Import Fixer v1.2 = Eng + Kor  (0) 2009.02.08
  1. 타이레놀 2009.03.31 19:40

    축하합니다~ 너무 쉽죠?

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2009.03.31 21:11 신고

      와 ㅋㅋㅋㅋㅋㅋㅋ 어때요, 참 쉽죠?? ㅋㅋㅋㅋ

  2. 해커 제자 2009.04.01 02:18

    참 쉽죠잉~?

  3. Lr라 2009.04.02 22:15

    ......... 이런거였나용?;
    ㅎㄷㄷ;; 쉽네;; 함수에다가 브레이크 걸고 풀었는데.. 생각하고 30초만에 푼..ㄷㄷ;

  4. soph 2009.06.29 17:30

    저도 성공...^^;
    감을 못잡을땐...정답이 유행어인 줄 알고...
    참 쉽죠잉~<---이거도 대입해 보았다는....^^
    축하합니다~ 너무 쉽죠?

+ Recent posts