본문 바로가기

Reversing/개념

[DreamHack] 1강 : 리버스 엔지니어링이란

DreamHack에서 제공하는 Reverse Engineering의 강의는 총 7강이다. 

강사님이 강의하는 방식의 강의는 아니고, 설명이 쓰여있는 PPT 형식에 가깝다.

하지만 이해하기도 쉽고, 무엇보다 짧은 슬라이드로 이루어져있어서 빠르게 개념을 잡기에 좋은 것 같다.

 

<1강> : 리버스 엔지니어링이란

< Reverse Engineering >

     : 이미 만들어진 시스템이나 장치에 대한 해체나 분석을 거쳐 그 대상 물체의 구조와 기능, 디자인 등을 알아내는

       일련의 과정 

 

< Disclaimer >

     - 학습 및 연구용으로 많이 이용되는 기술일 뿐만 아니라 각종 악성코드나 불법 프로그램의 분석 및 대응

        수단으로도 효과적인 기술음

     - 그러나 소스 코드를 비롯한 전체적인 작동 원리를 알아낼 수 있다는 점에서, 각종 상용 프로그램의 지적 재산권을

        침해할 수도 있는 양날의 검임.

 

< Static Analysis (정적 분석) vs Dynamic Analysis (동적 분석) >

    1.  Static Analysis(정적 분석) 

        : 프로그램을 실행시키지 않고 분석하는 방법

        : 정적분석을 위해서는 실행 파일을 구성하는 모든 요소, 대상 실행 파일이 실제로 동작할 CPU 아키텍처에

           해당하는 어셈블리 코드를 이해하는 것 필요

    2.  Dynamic Analysis(동적 분석)

        : 프로그램을 실행시켜서 입출력과 내부 동작 단계를 살피며 분석하는 방법

        : 동적 분석을 위해서는 실행 단계별로 자세한 동작 과정을 살펴봐야 하므로, 환경에 맞는 디버거를 이용해

           단계별로 분석하는 기술이 필요

 

< 코드가 컴파일되는 과정 > 

    1.  Source Code ???  Binary Code

          - 사람이 이해할 수 있는 소스코드를 컴퓨터가 이해할 수 있는 형태인 프로그램(바이너리)로 바꾸려면 컴파일이

             필요하다. 이 과정에 사용되는 프로그램을 '컴파일러'라고 부르며, 모든 프로그래밍 언어가 컴파일러를 통해서

             실행 가능한 바이너리가 되는 것은 아니지만, 대개는 단독적으로 실행 가능한 바이너리가 되기 위해서 컴파일

             과정을 거친다. 과정은 아래와 같다.

          - 최종적으로 어셈블리 코드가 기계 코드로 번역되는 과정을 어셈블(Assemble)이라고 하며, 어셈블을 통해

             실행 가능한 바이너리가 완성된다.

   <과정>

      1) 원본 소스코드에는 사람이 알아보기 쉽도록 각종 주석, 매크로, 참조할 헤더 파일 등을 포함하고 있기도
          한다.
이러한 정보는 실제로는 코드가 아닌, 참조를 위해 붙여둔 정보이므로, 컴파일러는 이러한 정보를
          미리
처리한다.

      2) 1)을 통해 준비된 '중간 언어'를 컴파일러가 분석하고 최적화하여 어셈블리 코드로 만든다.



     ※ 어셈블리 코드는 컴퓨터가 이해할 수 있는 기계 코드를 사람이 알아보기 쉽게 명령어(Instruction) 단위로

         표현한 것.

 

    2.  Source Code ???  Binary Code

          - 바이너리를 분석하여 어떠한 방식으로 동작하는지, 더 나아가 어떤 소스 코드를 바탕으로 만들어졌는지를

             알아내기 위해서는 컴파일러가 수행하는 과정을 역으로 진행해야 한다.

          - 이렇게 바이너리 코드를 어셈블리 코드로 변환하는 과정을 디스어셈블(Disassemble)이라고 한다.