"리버싱 공부를 어떻게 시작해야 할지 모르겠어요. 도와주세요." 라는 질문을 종종 받곤 합니다. 제가 블로그 활동을 하는 이유는 우리나라의 리버싱 기술 수준을 향상시키고, 리버싱 기술을 널리 전파하는데 작은 힘을 보태는 것입니다. 특히 리버싱에 처음 입문하시는 분들께 길잡이 역할을 할 수 있다면 더이상 바랄게 없습니다.

과연 어떻게 하면 리버싱을 잘 할 수 있을지 제 생각을 얘기해 드리겠습니다.



1. 모든 공부에는 "목표"가 있어야 합니다.


"리버싱 전문가가 되기 위해", "취직을 위해", "흥미를 위해", "해커가 되기 위해" 등의 자신만의 목표가 필요합니다. 이러한 목표가 없으면 힘든 공부를 지속하기 어렵습니다. (도중 포기할 확률이 높아진다는 뜻입니다.) 목표는 여러분들에게 방향을 제시합니다. 그 목표를 향해 한발 한발 전진하시기 바랍니다.


2. "긍정적인 마인드"를 가지세요. 


잘못된 편견을 가지신 분들이 많이 계십니다.

- "저는 C 언어도 모르는데요... 리버싱을 할 수 있을까요?"  --->>> 물론이죠.
- "저는 어셈블리를 해본적이 없는데요... 리버싱을 못 하겠지요?" --->>> 천만에요. 잘 하실 수 있습니다.
- "저는 윈도우즈 구조를 전혀 모르는데요... 그래도 리버싱을 할 수 있을까요?" --->>> 무지 잘하게 되실 겁니다.

바로 위와 같이 "저는 XXX 를 모르는데요" 라던지 "저는 YYY 를 해본적이 없는데요" 라는 말은 리버싱을 공부할 때 전혀 의미없는 말입니다. 이런 말은 지레 겁을 먹게 만들고, 도전 의식을 꺾어버립니다. 시도조차 못해보고 포기하게 만드는 부정적인 말입니다. 오히려 "XXX 를 모르기 때문에 배우고 싶다" 라고 긍정적인 생각을 해보시기 바랍니다.

배워야 할 가짓수를 따지자면 수십 가지가 넘을 것입니다. 리버싱 초보자가 그걸 처음부터 다 배워야 할까요? 너무 힘들겠지요. 지겨워질 겁니다.

그냥 새로운 내용이 튀어 나올때마다 다 해결하고 넘어가려고 하지 마시고 일단 맘에 묻어두시고 계속 진행하시는 것이 중요합니다. 반복 학습 하는 과정에서 한가지씩 차츰 차츰 배워나가시면 됩니다.

예를 들어 "XOR EAX, EAX" 의 의미는 디버깅을 몇 번 해보시면 저절로 체감하게 되는 내용입니다. 처음 볼때나 낯설고 흥미롭지요. 하지만 100번 봤다고 생각해 보세요. 그냥 당연하게 받아들이게 됩니다. 오히려 같은 의미의 "MOV EAX, 0" 명령어가 이상하게 보일겁니다. XOR EAX, EAX 를 왜 안썼을까 하고 말이죠.


3. "재미"를 느끼셔야 합니다.


초보일수록 더더욱 리버싱 과정에서의 재미를 찾으셔야 합니다. 어렵고 지겨운데 어떻게 계속 해나갈 수 있겠습니까? 리버싱이 재밌고, 하나씩 모르는 걸 배워나가고, 내가 맘먹은대로 프로그램을 패치시키는 이런 과정에서 재미를 찾으셔야 하지요.

사람은 재미있는 일이라면 남들이 아무리 말려도 스스로 하게 되어있답니다.


4. "검색"을 생활화 하셔야 합니다.


"검색하면 9할은 나온다" <- 제가 어디서 읽은 후 맘속에 담아둔 명언 입니다. 특히 리버싱 기술은 수많은 검색을 통한 지식 습득이 필수적입니다. 역사가 짧고 관련 전문가도 적고 관련 서적도 거의 없다시피 하니까요. 일단 믿고 검색해 보시기 바랍니다. 반드시 원하시는 내용을 찾을 수 있으실 겁니다.


5. 제일 중요한건 "실천"입니다.


"Just Do It" 아시죠~

뭔가를 이루고는 싶은데... 맘을 먹으셨으면... 행동을 하셔야죠... 그것도 지금 당장 하는겁니다...

제 블로그에 있는 HelloWorld 부터 무작정 따라해보는 겁니다. 당연히 처음에는 하나도 아는게 없지요. 모든게 낯설게 느껴집니다. (특히 어셈블리 명령어는 거의 외계 언어로 보이죠.)

첫 목표는 디버거를 이용해서 main() 함수를 찾아가는 겁니다. 디버거에 일단 익숙해 지기 위해서 메뉴도 하나씩 건드려 보고요. tracing(StepIn[F7], StepOut[F8] 명령어를 이용) 을 마구 해보는 겁니다. 차츰 감이 오다가 결국 main() 을 찾게 됩니다. C 소스 코드와 Disasembly 코드의 차이도 확인해 보시구요. 시작은 성공하신 겁니다! 출발이 좋군요. ^^

그다음 간단한 crackme, patchme, unpackme 등을 찾아서 해보시구요.

흔히 볼 수 있는 메모장, 계산기등을 패치해봅니다. (아주 간단히 말이죠. 가령 기능을 막아본다던지 하는 그런 정도로요.) 그 후 차츰차츰 대상을 넓혀 가시는 겁니다.


6. "느긋한 마음"을 가지세요.


리버싱 초보자가 가장 걸리기 쉬운 병이 바로 "조급증" 입니다. 빨리 성과를 내고는 싶은데 공부가 만만치는 않고 실력은 제자리에서 맴돌고 있습니다. 자신이 얼마나 모르는 것인지, 제대로 가긴 하는 건지 너무 답답합니다. 어셈블리, 윈도우즈 내부구조, PE 파일 포멧, API 후킹 등 뭐 하나 쉬운게 없습니다. 어셈블리 한가지만 봐도 어디까지 공부를 해야 하는지 알 수 가 없지요. 이럴때 마음이 급해지고 목표를 잃어 버리게 됩니다. 

제가 해드리는 얘기를 잘 읽어 보시기 바랍니다.

世界最强 大韓民國 

위 한자들을 읽어 보세요. "세계최강 대한민국" 입니다. 대부분 정확히 읽으셨을 겁니다. 그렇다면 안보고 정확히 쓸 수도 있으신가요? 아마 안보고 쓰는건 쉽지 않으실 겁니다. ^^ 위 8 글자 중에서 한 두 글자를 모르더라도 주변 글자들을 통해서 전체를 읽어 낼 수 있습니다. 

저를 비롯한 많은 리버서들이 어셈블리 명령어를 100% 자유자재로 구사하지는 못합니다. 몇명은 그래도 어셈블리 프로그래밍이 가능하지만 많은 사람들은 그렇지 못합니다. 마치 위의 한자를 읽을 수만 있고 쓸 수는 없는 것과 비슷한 상황입니다. 그래도 리버싱만 잘해요~ ^^ 명령어를 모르면 찾아 보면 되니까요. 그 정도만 알아도 프로그램의 동작 흐름을 알아낼 수 있습니다. 아마 이런식으로 몇 년이 더 흐르면 지금보다 훨씬 잘하게 되겠지요.

중요한 것은 저와 제가 아는 모든 리버서들도 초보 시절에는 (여러분들과 같이) 다 고만고만한 조건이었다는 것입니다. 꾸준히 하다보니 자연스럽게 어느 정도의 실력이 쌓인 것이지요. 절대로 조급해 하지 않았습니다.

여러분들도 지금 당장 시작해보세요~ 분명히 성과가 나타날 것입니다.

제가 어떻게 장담하냐구요? 저는 사실 구체적인 성공 사례를 알기 때문입니다. 블로그를 운영하면서 많은 분들께 과분한 감사의 메일을 받았습니다. 그 사연들을 읽어보면 감동에 이어 전율이 흐를 때도 있습니다.

- 대학 졸업작품이 단과대 전체 최우수 작품으로 선정되었습니다. (상까지 받으셨다는...)
- 개발 프로젝트에 후킹 기술을 적용해서 쉽게 해결할 수 있었습니다. (유명 회사 개발팀 소속이십니다.)
- XX소프트웨어 멤버십에 합격했습니다. (XX 취직이 보장된다는 그런 곳이라죠.)
- 리버싱 프로젝트("문서 암호화")를 성공시켰습니다. (아마 대학교 동아리 였던걸로 기억합니다.)
- 기타...

이분들께서는 대부분 리버싱 초보셨습니다. 본인들의 불타는 열정으로 엄청난 성취를 이루어 내신 거지요. 따라서 제가 여러분도 할 수 있다고 장담할 수 있는 것이고요.

공부하시다가 모르시는 내용이 있으세요? 질문하세요~ 저도 다른 분들의 생각을 들어보고 같이 고민하는 것을 좋아합니다.

자, 지금 당장 시작하세요~ ^^

ReverseCore
저작자 표시 비영리 변경 금지
신고
    이전 댓글 더보기
  1. 퍼다우크 2010.10.21 14:54 신고 댓글주소 | 수정 | 삭제 | 댓글

    얼씨구 언제 이런 블로그를 .....
    아이고 글도 많이도 쓰셨네요... 5년을 옆에 있었는데 이런걸 몰랐다니...T.T

  2. Middle Reverser 2010.10.22 18:24 신고 댓글주소 | 수정 | 삭제 | 댓글

    저 같은경우도 리버싱 은 함부로 모른다고 접근 하면 안된다고 동감합니다 ...
    저두 .. C 언어를 배우기 전에 Reversing 을 배우기시작했는데요 ... 스스로 부족한건 자동으로 공부를 하게 되더군요 ..
    동감합니다 ^^

  3. 이영호 2010.10.25 10:43 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요? 즐겨찾기 하고 간혹 한번 두번 읽고 가는 사람입니다.
    강의해주신 내용보니 참 좋아서요..저는 웹프로그래머라 윈도우 어플리케이션에 대해 잘 알지
    못하지만 어쩌다가 리버싱이란걸 알게되서 흥미를 갖고있답니다 ^^;;

    아무쪼록 감사의 말씀 전하고 갑니다 ^^

  4. binoopang 2010.12.09 16:25 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. 여기 참 자주 오게 되네요 ^^
    좋은글도 감사히 잘 읽고 갑니다.

  5. Lr라 2011.01.07 10:46 신고 댓글주소 | 수정 | 삭제 | 댓글

    정말 도움이 되는 글이군요 ㅠㅠ
    예전에 비해서 강좌가 많이 사라져서 슬펏는데 아쉽네요 ㅎㅎ
    런투 크랙이 망해버려서 공부할길도 없어지니말이져..
    점점 슬퍼지는 현실 ㅠㅠ

    • reversecore 2011.01.11 10:57 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      아이쿠~ 제가 원래 리버싱 입문자에게 약간의 도움이라도 드리고자 블로그를 시작했늗데 요즘 다른 일(?)로 강좌를 못 올리는 상황입니다.

      저말고도 다른 분들의 훌륭한 강좌가 많이 있습니다. 최소한 제가 리버싱 시작할 때보다는 훨씬 공부하기 좋은 환경이라고 감히 말씀드릴 수 있습니다. ^^~

      이럴때 실전 디버깅 연습을 많이 해보시는건 어떨까요?
      간단한 프로그램을 리버싱하면서 자신이 부족하다고 싶은 부분을 집중적으로 찾아서 공부하시는 겁니다.

      tuts4you 나 openrce 같은 사이트에 많은 샘플 예제가 있으니 그걸 활용해 보시는 것도 좋겠네요.

      감사합니다.

  6. Conscientia 2011.02.22 14:00 신고 댓글주소 | 수정 | 삭제 | 댓글

    와...정말 많은 도움이 되었습니다 자주자주 들르겠습니다 사...사..사탕합니다 리버스코어님

  7. blackrus 2011.02.22 23:49 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버스코어님을 멘토로 만났더라면 참많이배웠을거같습니다 ㅎ
    그렇다할 스승이없는 저에겐 참아쉽네요 ㅎㅎ

    • reversecore 2011.02.28 16:01 신고 댓글주소 | 수정 | 삭제

      저도 처음에 리버싱 멘토가 없었습니다. ^^

      장단점이 있는것 같습니다. 멘토가 없으면 없는대로 더 열심히 찾고 헤메고 하던 일들이... 지금보면 참 소중한 경험이 되었으니 말이지요.

      감사합니다.

  8. Aly 2011.03.01 11:18 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버싱을 공부하는 한 학생으로써, 정말 좋은말씀과 좋은정보들 감사합니다.

    앞으로 자주 들리면서 많은 질문드리도록 하겠습니다 ^^

  9. 초보 2011.03.16 01:05 신고 댓글주소 | 수정 | 삭제 | 댓글

    궁금한게 있습니다!
    PE 분석후, 디어셈블러를 통해 나온 어셈블리어에서
    변수의 이름도 파악할 수 있나요?
    함수이름은 파악이 되는걸로 아는데....
    답변부타드립니다ㅜ

    어셈블리어에서 어떤 정보까지 알 수 있는지... 찾아봐도 잘 안나오네요ㅜ

    • reversecore 2011.03.16 21:31 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      빌드 과정에서 생성되는 map 파일이란게 있습니다.
      디버거에 이 파일을 연결해주면 변수명, 함수명 등을 보실 수 있는데요.

      일반적인 상황에서는 map 파일을 배포하지 않으니 제삼자는 볼 수 없습니다. 따라서 전역변수와 함수명은 일반 주소로 표시되고, 로컬 변수는 [ESP+X] 형태로 표시되는 것이 일반적입니다.

      함수이름이 파악된다는 말씀은 아마 Win32 API 이름이 보인다는 뜻인것 같습니다. 그것은 DLL 에서 외부로 노출한 것이기 때문에 디버거에서 볼 수 있는 것이지요.

      감사합니다.

  10. 이제시작 2011.03.27 22:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    글을읽고 많은 도움을 얻어갑니다!
    적어도 저는 지금 3번째는 만족하고있네요~!
    요즘 하나하나 하는게 재미있습니다 !!

  11. 아직시작안함 2011.04.22 23:43 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 ,제가 네이버에 리버싱이라고 검색해보면 뜨겠지만 리버싱이라는 4만원짜리 책을 사려고 합니다. 그런데 그게 기초를 좀 다져야 한다고 하는데 그럼 어떤책을 기초로 삼아야 할까요? 추천좀 해주세요, 아니면 님께서 어떻게 시작하셨는지 가르쳐 주세요

    • reversecore 2011.05.03 00:56 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      그 책이 어떤 책인지는 잘 몰라서 뭐라 말씀드릴 수 가 없네요.

      제 경우는 업무가 리버싱이기 때문에 시작할 때 남들보다 훨씬 수월하였습니다.

      감사합니다.

    • 아톰보트 2011.06.26 11:08 신고 댓글주소 | 수정 | 삭제

      4만원 짜리 책이라는게 혹시....
      에이콘 출판사에서 나온 리버싱비밀을파헤치다 아닐까요?
      저도 이 책이있는데 초보자가 보기에는 좀 힘든거 같더라구요 ^^

    • Emalron 2011.08.22 11:45 신고 댓글주소 | 수정 | 삭제

      하지만 한국에 나온 책 중엔 가장 좋은 책 인거 같습니다.

  12. 아톰보트 2011.06.26 11:07 신고 댓글주소 | 수정 | 삭제 | 댓글

    좋은글 잘 읽었습니다!!
    즐겨찾기 해두고 매일 와야 할 거 같아요..
    전 이제 리버싱공부를 시작한 초보거든요 ㅎ
    앞으로 많은 조언과 가르침 부탁 드리겠습니다^^

  13. 리버서가되고싶다 2011.09.22 17:58 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    저는 리버싱을 하기위해 c언어공부를 하고있고 이해될떄까지 마친 후
    X86 프로세서를 위한 어셈블리언어 <--이걸 공부하려고하는데요..
    확실이 c랑 어셈을 어느정도 공부한 후에 리버싱을 하게된다면 수월하게 기술을 익힐수있을까요..?

    • reversecore 2011.09.28 21:04 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      C 와 Assembly 를 잘 알면 분명 디버깅이 수월합니다만...

      잘 모르시는 분들도 리버싱을 공부하면서 같이 병행으로 배우시는 분들이 많습니다.

      그래도 잘 하시더군요. ^^~

      감사합니다.

  14. Z2ong2 2011.09.30 13:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    시작할때 여기서 시작하고 중간에 크랙미 몇개 풀고 다시오네여
    지금 3달정도 리버싱 공부를 하고 있는데 이게.. 실력이 느는것 같지 않네여..
    그저 3달동안 이 블로그의 글 몇개와 크랙미 몇개 풀고 그랬는데도
    얼마전 청소년대회의 리버싱문제는 풀지도 못햇네요 ㅠㅠ
    너무 느린걸까요 아니면 조급한 생각일까요..
    조언 부탁드립니다

  15. 아로미 2011.11.08 02:54 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버스코어님 글을 읽으니 힘이 솟네요... +_+/
    지금부터 열심히 공부하겠습니다! 잘 부탁합니다 ^^

  16. 양승환 2012.02.12 03:00 신고 댓글주소 | 수정 | 삭제 | 댓글

    이글보니까 힘이 나네요~^^
    2~3개월동안 공부하면서 실력이 늘지 않는다고 자책해왔었는데..ㅎㅎ;;
    그래도 꾸준히 해볼랍니다~^^
    리버스코어님 글보구 호랑이기운받고 갑니다~
    감사합니다~^^

  17. 신ㅂㅣ 2012.07.23 16:02 신고 댓글주소 | 수정 | 삭제 | 댓글

    좋은말 감사합니다 ㅠㅠㅠㅠ

  18. 2012.08.09 13:24 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  19. Obelbert 2012.09.20 11:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    감사합니다.

  20. 기모찌 2017.04.02 15:41 댓글주소 | 수정 | 삭제 | 댓글

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





티스토리 툴바