본문 바로가기
Crack Me

 

Crack Me File을 Crack해 봅시다.

Debugger는 그 유명한 ollydbg를 사용해 보고요,

http://www.ollydbg.de/odbg110.zip

 

 

reverseMe.exe

요 App을 처음에 실행하면

 

요런창이 나옵니다.
Crack해서 성공했다는 Msg가 표시되게 해 보자구요.

 

Crack이라는 거에 관심만 많았었는데, 처음으로 한번 해 봤습니다. 개발자들이 처음에 손대기만 어렵지해보면 재미있게 몰랑 몰랑 하기 딱 좋은 문제들이 아닌가 하는 마음으로 해 봤어요. Debugging과 거의 같지만, Source Code가 없으니, 상상력이 더 좋아야 하는 것 아닌가 싶습니다.  저는 완전 초짜니까, 고수님들의 문제풀이를 구경해 보는 것도 아주 즐거울 것 같아 시작해 봅니다.

냐호~
참고로 Crack을 하게되면 다음과 같이 됩니다.

reverseMe_works.exe

 

눈으로 직접 하시려는 분들을 위해서, Disassemble된 창을 붙여 놓을께요.

 

 

Crack me의 답은 Highseek님이 너무 자세히 달아주셔서 너무 감사드리고,
조만간 또! Crack me를 올려보도록 하겠사옵니다!

 

reverseMe_works.exe
0.01MB
odbg110.zip
1.27MB
reverseMe.exe
0.01MB

 

Commented by highseek at 2010/07/23 18:34
에. 어셈코드에 대해 어느정도만 알고 있으면 나름 쉽지요 ㅋㅋ
Commented by 히언 at 2010/07/23 19:48
ㅎㅎ. 저는 Ollydbg를 처음써서 그런지, 엄청 헤맸습니다.
이제 아주 쬐금 감이 오네요~ 으흐흐.
Commented by highseek at 2010/07/24 01:39
학부졸업 때 그 올리디버거 거 가지고 논문에 쓸 데이터 만들다가 꽤 알게됐지요 ㅋ 순수 코딩만 하던 사람이 접하면 참 새로운 영역입니다.
Commented by highseek at 2010/07/24 02:04
하신 거 보니까, 4010d8까지 정석적으로 진행하셨더군요.

근데 사실 바로 401078쯤에서 바로 401205로 jmp 시켜도 됩니다..(...) 귀찮잖아요;;
Commented by highseek at 2010/07/24 02:18
에 그리고; 4010a9에서 readfile 하는 걸 바로 nop로 미신 모양인데, 이러면 앞에 push 때문에 스택포인터 꼬입니다; 프로그램 시작 시점과 종료 시점에 esp와 ebp가 동일해야 해요. 단순히 돌아가는 것 뿐 아니라, 스택포인터와 레지스터 값 등을 잘 정리해줘야죠.
Commented by 히언 at 2010/07/24 10:51
역시 하이시크님 멋지십니다. ㅎㅎ.
지도 그 생각 했었는데, 일단 결과값만 보여줄라고 밀어봤습니다.

답을 두가지로 해볼려고 했었어요.
하나는 그냥 jmp하는거, 하나는 dat file이 필요하니까 하나 만들어서 읽게 하는거.

요부분은 하이시크님한테 많이 배워야 하니까, 계속적인 조언 부탁드려요~ 와하하~
Commented by 히언 at 2010/07/24 12:12
아 하이시크님도 벙개 어때요?
Commented by highseek at 2010/07/24 12:13
뭐 시간만 맞는다면야.. :)

언제 하나요?
Commented by 히언 at 2010/07/24 12:15
http://bit.ly/9zQuzr ㅎㅎ
담주 목욜 강남역쯤 될 거 같애요.
Commented by highseek at 2010/07/24 12:56
히언님이 쏘시는 번개 좋군요 ㅋㅋ
Commented by ruring at 2010/07/24 13:03
과반수이상의 찬성으로 히언님이 쏘시기로 짝짝짝 ㅋㅋㅋ
Commented by 히언 at 2010/07/24 13:28
왜들이러세요.
살려달라구요. ㅋ

일단 목욜날 강남역에서 N빵으로 할껀데 아이템은 아직 안정했어요.
사람수가 좀 되니까, 공지를 해볼까... 싶어요.
Commented by highseek at 2010/07/24 13:27
401073에서 create file을 합니다. 근데 결과로 나온 eax를 보면 -1이죠. 즉 CreateFileA 함수호출이 실패한 건데요. 위의 인자값을 보면 파일명은 잘 들어간 거 같은데 왜 실패할까요?

401063에 들어가는 다섯번째 인자값을 보면 3이 들어갔어요. 이것은 OPEN_EXISTING으로, 파일이 존재해야 생성하는 옵션입니다. 뭐 자세한 API 함수 인자값 등의 설명은 MSDN 등에 잘 나와있으니 생략할게요. 지금은 파일이 없는 걸 만들어야 하는거니까, 적당히 CREATE_NEW(1)나 CREATE_ALWAYS(2), 혹은 OPEN_ALWAYS(4) 등을 적절하게 주면 파일이 생성되죠 :)

그리고 밑에를 보니까.. READFILE 하고 파일을 읽는데,40211a 번지를 인자값으로 넣는 걸 보니 이 주소값이 아마 버퍼인 모양입니다. 일단 기억해두고.. 4010B8을 보니 cmp 명령을 통해 읽어온 데이터값이 0x10인지를 비교하네요. 402173이라는 데이터영역인데, 위의 readfile에 이 영역도 인자값으로 들어갑니다. 아마 이건 읽은 길이겠죠. 우리는 없던 파일을 만든거니 당연히 길이는 0 일 겁니다. 뭐, 0x10을 0x00으로 바꿔줍시다;;

그 아래 루프문이 있는데, 40211a번지부터 ebx를 첨자로 사용해 죽 포인터를 이동해가면서 돌면서 뭔가를 수행해요. 이 번지에는 물론 널값들만 있습니다. 이 번지는 위의 readfile에서 받은 버퍼였죠?

mov al byte ptr ds:[ebx+40211a]
cmp al, 0
je short 004010d3
cmp al, 40
jne short 004010d0
inc esi
inc ebx
jmp short 004010c1

위 어셈을 슈더스러운 c로 표현하면 뭐 대충 이렇게 될 겁니다.
int ebx = 0;
int esi = 0;
char *buffer = 0x40211a;
while()
{
int nData = *(ebx+buffer));
if(nData == 0)
break;
if (nData == 0x47)
esi++;
ebx++;
}

뭐 즉석에서 변환한거라 지저분하긴 하지만 ㅋㅋ 로직 이해하는 데는 무리 없으실 거라 봅니다. 우리의 공백파일(-_-)은 읽으면 당연히 널이 나오니 아마 저 break에 걸려 빠져나오겠죠?

근데 문제는 빠져나온 다음입니다. 위에 xor esi esi을 사용해 0으로 초기화시켜줬고, 루프문에서 esi를 하나도 증가시키지 않고 나왔기 때문에 당연히 esi는 계속 0일 건데..

4010d3에 보면 cmp esi, 8. 해서 8이랑 비교하네요;; cmp 해서 jl 하는거 보니 if(esi<8) goto 실패; 뭐 이런건가봅니다. 뭐, cmp esi, 0으로 하죠.

그럼 이제 4010d8의 jmp문을 통해 성공 주소값으로 점프합니다 :) 완성이지요.




Commented by 히언 at 2010/07/24 13:41
훨씬 아름다워 졌군요!!! 역시 이런 몰랑몰랑이 더 재밌나 봅니다. ㅎㅎ
Commented by ruring at 2010/07/25 12:40
이게뭐에요 =-=?
Commented by 히언 at 2010/07/28 20:45
왜 모르는 척 이세요!!
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.
친절한 임베디드 시스템 개발자 되기 강좌 글 전체 리스트 (링크) -



댓글





친절한 임베디드 개발자 되기 강좌 글 전체 리스트 (링크) -