#0. prologue

분야를 막론하고 기술자(특히 엔지니어)들은 자신만의 작업환경과 손에 익은 도구(장비)가 있습니다.

기술자(특히 엔지니어) 란 특정 업무를 위해서 필요한 도구를 아주 능숙하게 다룰 줄 아는 사람들입니다.

같은 도구를 사용하더라도 기술자의 능력에 따라서 전혀 다른 결과를 보여줍니다.
(더 나아가서 필요한 도구를 직접 만들어 내기도 합니다.)

또한 기술자들은 각자 자신만의 도구를 가지고 있으며
한번 손에 익힌 도구를 되도록 오래 쓰고 왠만해서는 바꾸려 하지 않습니다.
(바꿀 때도 될 수 있으면 같은 회사의 후속 제품으로 바꾸려고 하지요.)

남의 도구, 남의 작업환경에서 일을 하면 아무래도 불편하다고 생각합니다.

즉, 자신만의 작업환경과 자신만의 도구가 갖춰져야 그 기술자의 진정한 실력이 100% 발휘 된다고 할 수 있습니다.



#1. Reverse Code Engineer (Reverser)

리버서들은 어떨까요?

리버서도 역시 IT 엔지니어 범주에 들어가기 때문에 위에서 언급한 일반적인 기술자의 성향과 다를 바가 없습니다.

리버싱을 하기 위한 도구의 종류만도 수십 가지가 넘으며, 각 종류별로 다양한 제품들이 존재합니다.
또한 IT 분야의 특성상 계속해서 새로운 도구가 개발되고 있습니다.

도구의 종류만도 아래와 같이 매우 많습니다. (언급하지 못한 것도 많을 것입니다.)

disassembler
debugger - PE, script, etc
development tool - assembly, C/C++, etc
editor(viewer) - text, hex, resource, retistry, string, PE, etc
monitoring tool - process, file, registry, network, message, etc
memory dump
classifier
calculator - hex, binary
compare tool - text, hex
packer/unpacker
encoder/decoder
virtual machine
decompiler - VB, Delphi, etc
emulator
...



#2. 좋은 분석 도구 선택의 5 가지 기준

아래에 ReverseCore 만의 도구 선택 기준(가이드)을 제시합니다. (참고만 하세요~)


첫째, 도구 개수를 최소화시킨다.

남들이 쓴다고 해서 기능을 알지도 못하는 도구를 잔뜩 가지고 있어봐야 도움이 되지 않습니다.
자신에게 필요한 도구만을 각 종류별로 하나씩만 사용하는 것이 좋습니다.

자신의 실력에 맞는 것만을 고르고 차츰 하나씩 늘려나가시면 됩니다.

또한 중복된 기능의 도구들은 하나로 정리하는 것이 좋습니다.


둘째, 도구는 기능이 단순하고 사용방법이 편리한 것이 좋다.

실력이 늘어날 수록 사용해야 할 도구의 개수도 늘어납니다.
기능이 단순하고 인터페이스가 직관적일 수록 사용하기에 편리합니다.

여기서 기능이 단순하다는 말은 리버싱 도구치고는 단순하다는 말입니다.
(Windows 의 계산기, 메모장 수준을 생각하시면 안됩니다. ^^)

따라서 아무리 단순한 리버싱 도구를 하나 익히는 데만도 어느 정도 시간이 필요합니다.


셋째, 기능을 철저히 익힌다.

아무리 좋은 도구라도 사용할 줄 모르면 무용지물 입니다.

자신이 이미 가지고 있는 도구에서 제공되는 기능인데도,
그걸 알지 못하고 다른 도구를 찾는 분들이 많습니다.

일단 도구를 선택한 후에는 제공되는 메뉴얼을 한번 정독해보시는 것이 좋습니다.
자주 사용하는 기능의 단축키 정도는 외워 두시면 작업이 훨씬 수월합니다.
(단축키를 잘 쓰면 확실히 자타공인 전문가처럼 느껴집니다.)


넷째, 꾸준히 업데이트 한다.

리버싱도 IT 범주에 속하기 때문에 기술 발전 속도가 매우 빠릅니다.

새로운 기술에 대응하기 위해 도구들도 빠르게 변화하기 때문에
사용하는 도구의 업데이트는 매우 중요한 일입니다.

따라서 꾸준히 업데이트를 지원하는 도구를 선택하는 것이 좋습니다.


다섯째, 도구의 핵심 동작 원리를 이해한다.

도구를 더 잘 사용하기 위해서 동작 원리를 이해하는 것이 좋습니다.
더 나아가 테스트용 프로토타입을 만들 수 있다면 금상첨화 입니다.

이 부분을 간과하시는 분들이 매우 많습니다.
하지만 높은 수준의 리버싱 실력을 쌓기 위해서는 필수적인 사항입니다.

예를 들어 debugger 의 동작원리를 이해하고 있으면,
anti-debugging 기법을 잘 회피할 수 있습니다.

원리를 이해하지 못하고 도구에만 의존하면,
간단한 트릭도 해결하지 못하고 다른 도구를 찾아 나서야 합니다.
소위 말하는 "도구의 노예"가 되는 것이지요. (이것만은 꼭 경계해야 겠습니다.)



#3. epilogue

debug.exe 라는 프로그램을 아시나요?
MS-DOS 시절부터 존재하던 16-bit debugger 입니다. (XP 에도 존재합니다.)

커맨드 창에서 debug.exe 를 실행하고 '?' 명령으로 도움말을 보겠습니다.


위에 보이는 명령어가 전부입니다.

단순하지요?

제가 아는 어떤 분이 debug.exe 로 16 bit DOS 프로그램을 분석하시는 걸 본 적이 있습니다.

뭔가를 실행시키더니 키보드를 다다다다 두들기면서 화면이 번쩍 번쩍 넘어가는데,
바로 옆에서 지켜보면서도 무슨 작업을 하는지 도저히 알 수 없었습니다.
(눈이 그분의 작업 속도를 따라가지 못한 거죠.)

처음에는 실행되는 프로그램이 debug.exe 인지 조차도 몰랐었습니다.
(전 그때 당시 이미 debug.exe 를 한달 정도 써본 경험이 있었음에도 불구하고 말이죠.)

그리고는 다 됐다면서 결과를 넘겨 주시더군요.
그때 그분이 사용하신 프로그램이 debug.exe 라는 걸 알고 충격에 휩쌓였었죠.

'저 단순한 debug.exe 만으로 이 일을 이렇게 빨리 해냈단 말인가?' 하고 말이죠.

그 이후로 제가 어떤 도구를 고를 때 나름대로의 기준을 세우게 되었습니다.

그리고 하나의 깨달음을 얻었습니다.

"평범한 도구라도 극한까지 연마하면 천하에 다시 없는 비범한 도구가 된다."

마치 무림고수(武林高手)가 수련에 수련을 거듭해서 검(劍)을 버리고
결국에는 초(草)/목(木)/죽(竹)/석(石)을 모두 검처럼 사용할 수 있듯이 말이죠.


여러분은 어떻게 생각하시나요? ^^


  1. showtime 2009.10.08 13:00 신고 댓글주소 | 수정 | 삭제 | 댓글

    잘 읽고 갑니다~ ^^ㅋ

  2. 베리굿 2009.11.07 22:20 신고 댓글주소 | 수정 | 삭제 | 댓글

    감사합니다.^^

  3. 부자봉스 2009.11.12 00:43 신고 댓글주소 | 수정 | 삭제 | 댓글

    그렇게 생각합니다 흑

  4. reverse 2011.05.24 01:06 신고 댓글주소 | 수정 | 삭제 | 댓글

    이 블로그가 정말 도움이 많이 되네요
    ~~
    꾸준히 하루에 한문제씩이라도 풀어재끼껫습니다!!

  5. 석대진 2012.09.18 17:12 신고 댓글주소 | 수정 | 삭제 | 댓글

    요즘 이상하게 리버싱이 궁금해서, 책을 선택중에 있습니다. 30일날 나온다고 하여, 그때까지 블로그를 조심씩 읽어 보려고 합니다. debug.exe하니깐 피터 노턴 아저씨의 어셈블리 책이 생각나네요.




Reverse Engineering (RE)



일반적인 의미에서 Reverse Engineering (RE : 역공학)이라고 하면,
물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작등을 분석하여
원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가시키는
일련의 작업이라고 할 수 있습니다.


Reverse Engineering(이하 리버싱) 의 개념은 여러분의 일상생활 속에서도 찾아 볼 수 있습니다.

회사에서 리버싱이 사용되는 예를 들어 보겠습니다.
가령 경쟁사에서 신제품을 출시했다고 해봅시다.
R&D 부서에서는 얼른 구입해서, 어떤 새로운 기능이 있으며 어떻게 만들었는지 살펴볼 것입니다.

구현 능력이 엇비슷 하다면 금방 따라 만들 수 있을것입니다.
혹은 원래 기능의 단점을 보완하고 더 새로운 기능을 추가시킬 수 있을지도 모릅니다.



Reverse Code Engineering (RCE)



소프트웨어 역공학의 의미는 일반적인 의미의 역공학과 기본적으로 같은 개념이지만,
분야를 소프트웨어로 한정지어 놓았다고 이해하시면 되겠습니다.

우리나라에서는 아직 정확한 용어의 통일이 되지 않아서 여러가지 용어들이 같이 사용되고 있습니다.
많은 분들께서 Reverse Code Engineering, Reverse Engineering, 역공학, 리버싱등의 용어를 마구 섞어서 쓰고 계십니다.

제 블로그에서도 'RCE', 'RE' 혹은 편하게 '리버싱' 이라고 표현하겠으며,
제가 가장 좋아하는 단어인 '분석'  또는 '상세분석' 이라는 말을 많이 쓰도록 하겠습니다.
말 그대로 소프트웨어를 리버싱 관점에서 상세하게 분석한다는 뜻입니다.


일반적인 소프트웨어 혹은 프로그램들의 제작방법을 보면,
먼저 소스 코드를 작성하고 컴파일/링크 과정을 거쳐서 실행가능한 binary 형태의 파일로 만들어 집니다.

여기서 실행가능하다는 말은 컴퓨터가 그 binary 를 이해할 수 있어서
프로그램을 제작자의 의도대로 실행 시킬 수 있다는 뜻입니다.

컴퓨터를 잘 이해하고 있는 사람 또한 같은 바이너리 코드를 보고 이해할 수 있습니다.
(물론 이해 속도는 떨어지겠지만요.)

일반인들이 실행가능 binary 파일의 내용을 보면 마치 고대의 해독 불가능한 상형문자를 보는 것과 마찬가지로 그 내용을 이해할 수 없지만, 소프트웨어 역공학 전문가들의 눈에는 그 내용이 훤히 보이게 되는 것입니다.

어떻게 그런 일이 가능할까요?
컴퓨터의 구조와 언어를 능숙하게 익히면 가능합니다.

어떤 리버싱 전문가는 농담삼아(?) 이렇게 이야기 하기도 합니다.
“남들이 작성한 지저분한 C 소스코드 보는 것보다, 그 실행파일의 disasm 코드를 보는게 더 편해.”



RCE 방법



크게 두가지 방법이 있습니다. 정적분석동적분석입니다.

1) 정적분석
: 파일을 실행 시켜 보지 않고 분석하는 방법입니다.
  파일의 종류(EXE, DLL, DOC, ZIP, etc), 크기, 헤더(PE)내용, 내부 문자열, 실행압축여부, 등록정보, 디버깅정보,
  디지탈 인증서 등을 확인하는 것입니다.
  또한 디스어셈블러(Disassembler)를 이용해서 내부 코드와 그 구조를 확인 할 수 있습니다.

2) 동적분석
: 파일을 직접 실행 시켜서 분석하는 방법입니다.
  실행 증상(파일, registry, 네트워크 등)을 모니터링 하고,
  디버깅(debugging) 하여 기능, 동작, 메모리 상태, 레지스터 값, 코드 흐름을 살펴보는 것입니다.

두 가지 분석 방법 모두 편리한 유틸리티들을 사용하여 분석이 이루어지며,
경우에 따라서 두 가지 방법 중에서 한가지 혹은 두가지 모두를 사용하여 분석을 완료합니다.

제 경우에는 보통 정적분석으로 최대한의 정보를 수집하고 해당 파일에 대한 감을 잡은 후에 동적분석을 해봅니다.
Debugging 은 가장 마지막에 쓰거나 경우에 따라서는 아예 쓰지 않습니다.



패치(patch) 또는 크랙(crack)




프로그램의 파일 혹은 실행중인 프로세스의 메모리 내용을 변경시키는 작업을 패치(patch) 라 하고,
그 중에서도 의도적으로 저작권을 침해하기 위하여 변경시키는 작업을 크랙(crack) 이라고 합니다.

이러한 예는 일상생활에서 많이 접할 수 있습니다.

iPhone 을 크랙하여 쉘을 띄우고, 게임기를 크랙하여 복제 CD 를 사용할 수 있도록 하며
각종 SW 를 크랙하여 불법 복제를 가능하도록 하는등 셀 수 없이 많은 크랙을 볼 수 있습니다. 

제 블로그에서는 정품 소프트웨어의 크랙 방법을 다루지 않습니다.
어디까지나 리버싱의 원리와 OS 내부구조에 대한 깊이있는 공부가 주된 관심사 입니다.



ReverseCore



리버싱 방법과 그 원리에 대해서 설명하는 블로그로 만들겠습니다.

ReverseCore 접속 준비물은 적당한 의욕  구글(Google) 입니다. 


- 적당한 의욕 

    과욕을 부리시면 안됩니다.
    리버싱은 인내, 인내, 인내의 연속입니다.
    과욕을 부리시다가 생각대로 안되면 중도 포기하게 됩니다.
    "안돼면 내일 하지 뭐~" 이런 자세가 좋은것 같습니다.


- 구글(Google) 

    뭐든지 다 있다고 그냥 믿으십시요.
    내가 궁금한 내용이 다 있다 라고 그냥 순수하게 믿고 찾으시기 바랍니다. 
    지금부터 배우려는 내용은 이미 수년전에 누군가가 했었던 것들이며,
    수년동안 많은 사람들이 따라 해봤던 내용들입니다.
    만약 찾는게 진짜로 없다면... 
    축하드립니다.
    드디어 당신은 리버싱 guru 의 경지에 도달하신겁니다. ^^


제가 강조하고 싶은 내용은
리버싱이란 컴퓨터와 OS 내부구조에 정통해야 좋은 성과를 얻을 수 있다
는 것입니다. 


 

  1. showtime 2009.10.08 12:55 신고 댓글주소 | 수정 | 삭제 | 댓글

    잘 읽고 갑니다~ ^^ ㅋ

  2. 감동 2009.12.03 02:29 신고 댓글주소 | 수정 | 삭제 | 댓글

    칼럼에 있는 모든 글을 한자도 안빼고 다 읽었습니다.

    읽어 내려오면서 문장 실력에 감탄을 하지 않을수 없었습니다.

    지금부터 카테고리에 있는 모든 글을 읽어보고자 합니다.

    제가 얼마나 이해 할 수 있을지 모르나.. 1/10만이라도 깨우쳤으면 하는 바램입니다.

    • ReverseCore 2009.12.03 21:28 신고 댓글주소 | 수정 | 삭제

      칭찬 감사합니다. ^^

      하고자 하는 의지만 있다면 누구나 리버싱을 배울 수 있다고 생각합니다.

      질문 있으시면 올려주시고요~

      감사합니다.

  3. 호환 2010.05.24 13:35 신고 댓글주소 | 수정 | 삭제 | 댓글

    구독해놓고 훑어만 보다가 한번 정독을 해보려고 합니다 언제나 주옥같은 글 감사드립니다.

    공부하는 학생의 신분으로써 언제쯤 따라잡을 수 있을까 막막하지만 열심히 해보겠습니다!!

  4. 솔이파파 2010.09.27 10:53 신고 댓글주소 | 수정 | 삭제 | 댓글

    즐겨찾기 등록한지 벌써 6~7개월 넘었는데 아직 제대로 읽어보지도 못했습니다

    년초에 다잡은 마음 다시 잡아 처음부터 열심히 공부하도록 하겠습니다.

    정말 멋진정보 공유해주셔서 감사합니다 ^^;

    • reversecore 2010.09.29 01:26 신고 댓글주소 | 수정 | 삭제

      칭찬 감사합니다. ^^

      본업이 아닌 이상 다른 생소한 분야를 공부한다는 것은 사실 쉬운 일이 아닙니다. 그래도 의욕적으로 공부하시려는 모습이 보기 좋습니다. ^^ 공부하시다가 궁금하신 점 있으시면 질문 올려주세요~

  5. reversing 2010.11.06 09:04 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버싱에 관심 은 있었지만 리버싱 을 재대로 알수 없어고 어떻게 공부 해야 할지 몰랐습니다.

    그러나 이제 알수 있을꺼 같아 너무 좋습니다~ 이런 좋은 블로그 만들어주셔서 너무 감사합니다.

    앞으로 자주 들려 많이 배우도록 열심히 하겠습니다~ 잘부탁 드립니다!!

  6. systemkiller 2010.12.08 03:03 신고 댓글주소 | 수정 | 삭제 | 댓글

    어쩌다 보니 이런 훌륭한 곳을 찾았네요~

    그럼 열심히 공부해 보겠습니다 훗~

  7. Manwon 2010.12.18 21:12 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요!! 좋은글 잘 보고갑니다.

    코드분석하다가 궁금한게 생겼는데 질문좀 드려도 될까요??

    어셈 코드를 보다보니

    test al, al 이런식의 코드가 있던데..

    그밑에는 조건 점프문(JE같은)이 있구요

    JE같은경우는 굳이 테스트 하지 않고 JMP문을 쓰면 되지 않나요?

    test al, al 같은 코드는 도대체 어떨때 쓰는건가요??

    • reversecore 2010.12.23 15:29 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      네, 어셈블리 문법인데요.

      간단히 al = 0 인 경우에만 점프하라는 뜻인거죠.

      if al == 0
      jmp XXXX

      요렇게 이해하시면 됩니다.

      감사합니다.

  8. Reverser_H 2011.01.19 19:54 신고 댓글주소 | 수정 | 삭제 | 댓글

    항상 느끼는 거지만 정말

    정리가 잘 돼있다라는 느낌이 듭니다 .^^

  9. 밤벌레 2011.03.02 17:20 신고 댓글주소 | 수정 | 삭제 | 댓글

    오래 전부터 reversecore.com 을 알게 되었는데..
    이렇게 글남기는건 처음이네요..매번 눈팅만하다가....
    제일 첫장으로 와서 글남기네요..^^
    훌륭한 블로그입니다..여기서 많은 지식을 배워가게 되군요..^^;;
    책 출판하시면 저도 구입할 생각입니다..^^;;
    유저모드 다음엔 커널모드 리버싱 부분까지 책 내시면 core님의 추종자가 될듯한..^^
    깔끔한 정리와 글솜씨에 존경을 표합니다...

    자주 들러서 모르는 부분 많이 물어볼께요..
    잘 부탁드려요..^^

  10. 금강군 2011.06.13 10:41 신고 댓글주소 | 수정 | 삭제 | 댓글

    휴... 리버싱하자니 너무 막막했는데 이 블로그가 많은 도움이 될 것 같습니다. 벌써부터 기대가 되네요!! 처음부터 차근차근 배워보도록 하겠습니다~

  11. imovator 2012.07.12 14:58 신고 댓글주소 | 수정 | 삭제 | 댓글

    초급 java개발자인데 프로젝트 관련 문서가 보안이 걸려있어서
    문서DRM 해제 -> win32 api -> api 후킹 등 오늘 여러 경로를 거쳐
    종래에 귀 블로그에 방문하였습니다. 내용이 너무 알차고 좋은것 같습니다.
    글도 잘 쓰시구요. 부럽습니다. ㅋ

    진로 혹은 자기개발에 참고하고싶어서 질문을 하나 하고싶습니다.
    리버싱은 C나 C++를 선행학습해야 하는 것인지 그리고, API후킹등을 통해
    문서 DRM해제 등의 결과물을 얻는 다는것은 귀 블로그를 통하여 얻을 수 있는지
    가능하다면 어느정도의 노력(시간,열정)을 쏟아부음으로서 달성할 수 있는지 궁금합니다.

  12. 장호정 2012.08.28 21:56 신고 댓글주소 | 수정 | 삭제 | 댓글

    우연히 프로그래밍 쪽에 관심을 두다가 리버스 엔지니어링 이라는 것을 발견했습니다.
    정독 시도해 보겠습니다!

    기초적으로 알아야하는 지식좀 말씀해 주셨으면 감사합니다 ㅠㅠ

  13. Obelbert 2012.09.20 10:32 신고 댓글주소 | 수정 | 삭제 | 댓글

    역시 대단하세요.

  14. lunettes de soleil pas cher 2013.04.24 20:48 신고 댓글주소 | 수정 | 삭제 | 댓글

    귀를 기울여봐 가슴이 뛰는 소리가 들리면 네가 사랑하는 그 사람 널 사랑하고 있는거야.

  15. kshmk 2014.06.08 21:52 신고 댓글주소 | 수정 | 삭제 | 댓글

    OS공부를 한사람들은 리버싱공부가 좀더 쉬울것 같군요





티스토리 툴바