admin write
blogbloglocation loglocation logtag listtag listguest bookguest book
Add to favoritesrss feed



 

"Reverse Engineering"
거창하게 굳이 엔지니어링 이라는 단어를 붙이지 않더라도
어쨌건 꽤 오랜 기간 동안을 남들이 해놓은 것을 보면서
"와 이거 멋진데, 나도 한번 해보고 싶은데"라고 감탄만 했을 뿐,

그동안 시작하고야 말겠다는 의지가 부족한 탓도 있었겠지만
무엇보다도 '대체 무엇을 어떻게, 어떤식으로 공부를 해야 할것인가'
하는 문제가 가장 큰 장벽이었지 않았나 싶습니다.

일반적으로 뭘하나 해봐야겠다라고 생각이 들면
거기에 관계된 책을 사서 본다거나,
인터넷에서 관련 자료를 찾아본다거나 하는 수순을 따를 지언데,

이건 정말 너무 막막했습니다.
사실 지금도 막막하기는 마찬가지 지만
일단 뭐라도 한번 시작해보자는 생각으로 시작한게
크랙미 솔루션을 하나씩 풀어가는 것이었습니다.
아니지, 크랙미솔루션을 하나씩 풀어가보자 라고 생각 했다 라고 하는게
맞는 표현일것 같네요.
아직 시작한 것이 아무것도 없기 때문이죠.
이제 부터 시작이니..

이제 맨땅에 헤딩하는 식으로 제가 겪은 이야기들을 여기서 풀어 나가려고 합니다.
강좌라기 보다는 그냥 왕초보가 이러이러한 방법으로 해결했다 라는
일기 정도로 보아주시면 될것 같습니다.

아 그리고 노파심에서 한마디 덧붙이자면,
제가 진행해 나가는 내용을 보시면 아시겠지만
아직은 고급스킬이나, 수준높은 내용이 전혀 없습니다.
그것도 그럴것이 저도 이제 시작하는 마당에
지금 이 글을 읽으면서 리버스 엔지니어링 이라는 말을 처음 들으신 분이나
저나 똑같단 얘기지요.

제가 아는게 없으니 지금 현재로써는 조금이라도 숙련된 분이 보시기엔
너무도 당연한, 기초라고 말하기조차 힘든 이야기 밖에 할게 없을겁니다.

차츰 제가 공부한 내용이 많아지고,
이곳에 글들이 늘어남에따라 제 머리속에 들어간 내용만큼씩은
내용이 어려워지고 수준이 높아 지겠지요.
제가 원하는 바도 바로 그런 것 이고요.

뭐 결론은 기초라도 갖추신 분이 보기엔 너무 유치한 내용이 될수도 있으니
넘어 가시고 저처럼 시작을 하긴 해야겠는데
대체 어디서 부터, 뭐 부터 시작을 해야 할지 갈피를 잡지 못하는 분들에게는
이런 경우도 있네 하는 쇼케이스 정도로 활용되는것도 좋지 않을까 하는 생각입니다.

자 그럼 앞으로 우리는 공개된 '나를 크랙해 주세요~'라는 크랙미 솔루션들을 통해
합법적으로 크랙에 도전하게 될텐데요,
오늘의 첫번째 실험대상(?)은 abex라는 분이 만드신 첫번째 CrackMe 솔루션 입니다.
간단하게 오늘 요리할(?) 녀석에 대한 정보를 볼까요.

crackme author : abex
type                 : cdrom check
level                : easy

abex라는 사람이 만들었고, 시디롬 체크를 하는데, 난이도는 쉽다네요.
대체 어떻게 돌아 가는지 일단 실행이나 시켜 볼까요?

일단 위의 파일을 다운 받아 압축을 풀어 주세요.
압축을 푸신 폴더에 보면 abexcm1.exe라는 파일이 있습니다. 한 번 실행시켜 보도록 하죠.

처음 실행을 시켜 봤더니 위 그림처럼 자신이 HDD를 CD-Rom으로 인식하게 만들라고 하는군요.
[확인] 버튼을 클릭해봤더니 또 아래와 같이 나오네요.

CD-Rom이 아니라고 뜨고 확인을 한번 더 누르니 프로그램이 종료 됩니다.

자, 우리가 아무리 영어에 약하지만 대충 이정도는 이해할수 있죠.
모르긴 몰라도 이놈을 실행시키면 HDD인지 CD-Rom인지 확인을 하고서
CD-Rom이면 뭔가 다른 메세지를 띄우던가 할꺼고,
HDD이면 방금 처럼 에러를 띄우고 종료 하는가 봅니다.

자 그럼 일단 이놈이 어떻게 돌아가는지 부터 볼까요.

일단 저는 OllyDbg라는 놈을 사용하겠습니다. 버전은 1.10이고요.
이놈이 딱히 좋다 나쁘다 라고 평가할 처지도 못됩니다.
여러분이나 저나 제대로 써본적이 없으니까요.
어찌 되었건 그냥 이쪽으로 가장 유명한 툴중에 하나이고
마침 제가 가지고 있으므로 사용해 보기로 하죠.
일단 실행을 시킵니다.


위와 같은 창이 뜹니다.
비록 태어나서 오늘 처음 이 프로그램을 사용하는 우리지만
그동안 Windows의 GUI프로그램들에 굉장히 익숙해진 탓에
본능적으로 File > Open 을 클릭해
우리가 크랙해야 할 녀석을 일단 불러와야 겠다는 생각이 마구마구 드실겁니다.

일단 불러왔더니 화면이 전체적으로 네개의 프레임으로 분리되어 있고
각각의 프레임이 무슨 용도인지는 몰라도
가장 왼쪽 젤 위의 프레임을 보면 아까 우리가 보았던 반가운 메세지 들도 보이네요.

위의 그림에 초록색 박스 친 부분들을 보면
"Make me think your HD is a CD-Rom."      ← 편의상 메세지1 이라고 하겠습니다.
"Nah... This is not a CD-ROM Drive!"         ← 편의상 메세지2 이라고 하겠습니다.
"Ok, I really think that your HD is a CD-ROM! :D"      ← 편의상 메세지3 이라고 하겠습니다.
라는 메세지 들이 보이시는 가요?
메세지1과 메세지2는 이미 우리가 보았던 메세지고,
메세지3이 바로 오늘 우리가 하려는 하드를 시디롬이라고 인식 시켰을 때 뜨는 메세지인가 보네요.

그리고 왼쪽에 보라색으로 동그라미 친 부분을 보면
메세지2의 경우 000401028 번지부터 시작하고,
메세지3의 경우 0040103D 부터 시작한다는 것을 알 수 있습니다.

일단 여기까지는 뭐 대충 눈치로 이해가 되시죠.
우리는 지금 태어나서 처음으로 크랙이라는것을 하고 있으며,
사용하고 있는 OllyDbg라는 툴도 조금전에 File 메뉴의 Open 기능 달랑 하나 밖에는
사용해 본적이 없습니다.
다시 말해서 가지고 있는 지식도 없을 뿐더러
사용하고 있는 툴에 대해서도 무지하죠.
이런 상황이라면
우리가 할수 있는것들을 최대한 짜내서 해결해 보도록 하죠.
자 우리에게 주어진게 뭐가 있나요.

자 곰곰히 생각해 볼까요.
우리가 알아낸 것과, 할수 있는것을 다시 한번 정리 해 봅시다.
지금 우리가 크랙을 하려고 하는 프로그램은
하드인지 시디인지 확인을 해서 하드라면 에러메세지(메세지2)를,
시디라면 맞다는 메세지(메세지3)를 띄우는 프로그램 입니다.
그리고 하드로 판단 되었을때 띄우는 메세지2 부분은 000401028 번지에서 시작하고
시디롬으로 판단되어 맞다는 메세지3은 0040103D로 시작한다는 사실까지 알아냈지요.

여러분이 이 프로그램을 만든 사람이라면 이 프로그램을 어떻게 짰을까요.
십중팔구 이렇게 하지 않았을까요?
1. 우선 프로그램이 실행되면,
2. 하드인지 시디롬인지 체크를 해서,
3. 만약에 하드일 경우 에러메세지를,
4. 시디롬일 경우 맞다는 메세지를 띄울겁니다.

그렇다면 우리에게 중요한 부분은 바로 2번,
하드인지 시디롬인지를 체크하는 부분에서
체크 결과를 무조건 시디롬으로 한다던지,
아니면 체크 결과를 변경할 수 없다면
하드이면 어디로가고, 시디롬이면 어디로 가라 라고 해주는 부분에서
체크결과 하드로 판단이 되더라도 무조건 시디롬일때 가는 주소로 보낸다던지 하면 될것입니다.
방법은 여러가지 겠지만 대충 그렇게 생각 되시죠?

자 그럼 시작해 봅시다.
우리가 툴에 대해서라도 잘 알고 있다면 분명 더 쉽게 가는 방법이 있을테지만
제가 누누히 강조해온 대로 우리는 그렇지 못한 관계로
그냥 무식하게 처음부터 한줄한줄 훑어 보기로 하겠습니다.
다행이 코드도 몇줄 안되서 큰 무리는 없을 듯 하네요.

훑어 볼때 에러 메세지를 띄우는 000401028 번지로 보내는 부분과
맞다는 메세지를 띄우는 0040103D 번지로 보내는 부분이 눈에 띄인다면 특히 유의 하면서 말이죠.

자 확인 하셨나요?
훑어 보시면서 그림에 제가 보라색 사각형으로 색칠한 부분이 눈에 띄이시던가요?
저는 그게 눈에 확 들어오던데,
내용을 다시 한 번 볼까요.

JE SHORT abexcm1.0040103D


바로 이 부분 입니다.
앞에 내용 다 무시하고 0040103D가 뭡니까?
바로 우리가 원하는 메세지3을 띄우는 부분이죠?
이부분을 어떻게 만지면 우리가 원하는 0040103D로 보낼수 있을 거 같은데,

여기서 잠시
이제부터 우리가 어셈블리 명령을 공부해야만 하는 이유가 나오는 군요.
리버싱을 하면서 어셈블리는 기초로 알고 있어야 된다고들 하던데
바로 이래서 알아야 된다고 했군요.
저 위에 문장들이 어셈블리 명령이거든요.
저도 뭐 모르는 터라 인터넷에서 어셈블리 명령을 검색해 보니

바로 JMP가 특정한 메모리 오프셋으로 이동할 때 쓰이며,
JMP가 무조건 분기 라면
CMP나 TEST같은 명령의 결과에 따라서 분기하는 조건부 분기명령도 있는데
그중에 위에서 나온 JE는 결과가 같으면 분기를 하고,
JNE라는 명령도 있는데 이것은 결과가 같지 않다면 분기를,
이외에도 JZ, JNZ, JL, JB, JG 등 많은 명령 들이 있네요.
더 자세한 내용은 여러분들도 어셈블리 명령 찾아서 공부 하세요.

일단 다시 우리의 문제로 돌아가서,
우리는 "JE SHORT abexcm1.0040103D" 니까
뭔가를 비교하던지 해서 결과가 같을때만 0040103D로 보내는 군요.
여기서 결과가 같을 때 란 것은 당연히 하드인지 시디롬인지 체크를 해서
그 결과가 시디롬이라고 인식했을 때를 말하겠죠?
그렇다면 이 부분에서 JE 대신에 좀전에 제가 인터넷 검색해서 알아낸 명령인
JMP를 바꾸게 되면 어떻게 될까요.
JE가 조건이 맞을때만 분기, JMP는 무조건 분기라고 했죠.
아하! 눈치 채셨나요?
JE를 JMP로 고치면 무조건 0040103D로 가니까
메세지3을 출력하고 끝내겠네요? 그쵸?

자 그럼 실행에 옮겨 봅시다.
저는 그냥 JE명령이 있는 줄에서 왼쪽 마우스로 더블클릭을 했더니 다행이도 창이 하나 뜨네요.

그럼 고쳐볼까요, 딴거 손댈 필요없이 JE만 JMP로 고치고 [Assemble]버튼을 누르겠습니다.

자 일단 뻘겋게 색도 변하고 하는걸로 봐서 제대로 바뀌긴 한거 같습니다.
이제 정말 제대로 작동이 되는지 확인을 해봐야 겠죠?
확인하는 기능이 어디 있을까 메뉴를 쭉 살펴보니
Debug 메뉴에 Run이라는 메뉴가 보이네요, 실행 해볼까요?

첫번째는 역시나 자기가 시디롬으로 인식하게 만들라는 메세지가 뜨는군요
그리고 [확인]버튼을 클릭하자,
와우! 처음 실행했을때랑은 다르게 시디로 인식하고 있다고 메세지를 띄우네요!

자 방금은 실행만 해본 것이고, 이제 이렇게 변경된 부분을 실제 실행파일에 적용시키고
만약에 배포가 목적이라면 배포하면 되겠지요.
그러나 아쉽게도 아무런 지식 없이 OllyDbg의 메인 메뉴들만 들여다 봐서는
OPEN만 있지 변경된 내용을 적용해서 실행파일로 저장하는 기능은 찾을 수가 없네요.
이 부분은 좀더 공부를 해서 두번째 강좌로 올리도록 하겠습니다.
어셈블리도 공부해야겠고 OllyDbg의 사용법도 공부를 해야겠고
할것이 두개나 생겼네요.

사실 아직 파일로 저장하는 방법까지 끝낸것도 아닌 반쪽짜리 강좌를
한페이지 빼곡히, 그림파일 까지 첨부해 가면서
무슨 논문 모양 열심히 설명 했습니다만,
오늘 내용은 사실 "JE를 JMP로 바꾸어라" 밖에 없네요.
나중에 우리가 실력이 더 향상 된다면 오늘 한페이지나 걸려서
구차하게 설명한 내용을 정말 한문장으로 간단히 넘어갈 수 있는
실력까지 가게 되기를 바라면서 오늘은 마치도록 하겠습니다.

트랙백 보낼 주소 :: http://minjae.eelee.net/blog/trackback/1

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 응가
    2007/03/13 21:05
    댓글 주소 수정/삭제 댓글
    유용한 정보감사합니다 !!.
    크랙이 이런것이란걸 알게됬습니다^^.
    ㅅㄱ
  2. 응가
    2007/03/22 20:37
    댓글 주소 수정/삭제 댓글
    사진 자료와 강좌 흐름을 좀 퍼갈게여 ^^
  3. 임재민
    2007/04/21 18:46
    댓글 주소 수정/삭제 댓글
    유용한정보 감사합니다 자료점퍼갈꼐요
    • 임재민
      2007/04/21 19:00
      댓글 주소 수정/삭제
      d