[2] 리버스 엔지니어링이란?

본 글은 DreamHack의 강의 내용을 요약한 글이므로 자세한 내용은 dreamhack.io 에서 학습하시길 바랍니다. 

 

해커들의 놀이터, Dreamhack

해킹과 보안에 대한 공부를 하고 싶은 학생, 안전한 코드를 작성하고 싶은 개발자, 보안 지식과 실력을 업그레이드 시키고 싶은 보안 전문가까지 함께 공부하고 연습하며 지식을 나누고 실력 향

dreamhack.io

 

 

1. 리버스 엔지니어링 ( Reverse Engineering )  

(1) 개념

a.k.a 리버싱, 역공학

  • 이미 만들어진 시스템이나 장치에 대한 해체분석을 거쳐 그 대상 물체의 구조와 기능, 디자인 등을 알아내는 일련의 과정
  • 완성품의 설계도 없이 구조와 동작 과정을 알아내는 모든 단계

(2) 소프트웨어 리버스 엔지니어링 ( Software Reverse Engineering )

  • 소스 코드가 없는 상태에서  컴파일된 대상 소프트웨어의 구조 를 여러가지 방법으로  분석 
  • 메모리 덤프를 비롯한 바이너리 분석 결과를 토대로 동작 원리와 내부 구조를 파악
  • 위 과정을 바탕으로 원래의 소스가 어떻게 작성된 것인지 알아냄

(3) 리버싱 활용

 리버싱의 큰 이점 : 

 

  • 분석하고자 하는 대상에 대해 알지 못하는 상태에서도 대상의 동작 원리와 구조에 대해 알 수 있음

 

 리버싱 활용의 올바른 예 

 

  • 판매된지 오래된 프로그램
- 제작사에서의 개발 중단으로 지원 필요 시 어려움
- 소스 코드 미보관, 유실 등으로 포팅 등의 지원을 위해서 리버싱 필요
ex ) 1996년 발매된 "디아블로" - 리버싱으로 모딩된 버전 공개

 

  • 각종 프로그램의 보안성 평가 및 악성코드 분석
- 소스코드가 없는 상태에서 진행
- 분석가가 실행 흐름을 리버싱을 통해 파악
- 대상 프로그램 설계 방식의 안전성 / 분석 대상의 악성코드 동작 방식 및 피해규모 파악 가능

 

 리버싱 활용의 잘못된 예 

 

  • 불법 프로그램 생성
- 상용 프로그램을 구입하지 않고 공짜로 이용하기 위한 키젠 프로그램 / 시리얼 넘버 생성기, 정품 크랙 프로그램
- 유료로 판매되는 프로그램의 정품 인증 방식을 리버싱을 통해 파악

 

  • 게임 핵 프로그램
- 게임과 관련된 각종 프로그램을 분석해서 게임핵 제작

 

 

2. 면책조항 ( Disclaimer )  

" 리버싱은 양날의 검 "

장점 학습 및 연구용으로도 많이 이용되는 기술
각종 악성코드나 불법 프로그램의 분석 및 대응 수단으로도 효과적인 기술
단점 소스 코드를 비롯한 전체적인 작동 원리를 알아낼 수 있다는 점

 

(1) 리버싱의 법적 허용 범위

 합법 

  • 저작권을 침해하지 않는 범위 내에서의 리버싱은 제한적으로 위법하지 않음
  • 테스팅(Testing) 또는 연구, 학습 등을 목적으로 한 리버싱

 

 위법 

  • 재배포, 무단 이용저작권을 침해하는 리버싱

 

(2) 관련 법

 저작권법 제35조의 5 

(※ 참고 : dreamhack 교본의 법규는 개정 전 법규, 2019년 11월 26일부로 저작권법 제 35조 일부 변경)

저작권법 제35조의5(저작물의 공정한 이용)  ① 제23조부터 제35조의4까지, 제101조의3부터 제101조의5까지의 경우 외에 저작물의 통상적인 이용 방법과 충돌하지 아니하고 저작자의 정당한 이익을 부당하게 해치지 아니하는 경우에는 저작물을 이용할 수 있다.  <개정 2016. 3. 22., 2019. 11. 26.>
[제35조의3에서 이동  <2019. 11. 26.>]

 

 저작권법 제101조의3(프로그램의 저작재산권의 제한) 제1항 제6호 

저작권법 제101조의3(프로그램의 저작재산권의 제한)  ① 다음 각 호의 어느 하나에 해당하는 경우에는 그 목적상 필요한 범위에서 공표된 프로그램을 복제 또는 배포할 수 있다. 다만, 프로그램의 종류ㆍ용도, 프로그램에서 복제된 부분이 차지하는 비중 및 복제의 부수 등에 비추어 프로그램의 저작재산권자의 이익을 부당하게 해치는 경우에는 그러하지 아니하다.  <개정 2020. 2. 4.>

6. 프로그램의 기초를 이루는 아이디어 및 원리를 확인하기 위하여 프로그램의 기능을 조사ㆍ연구ㆍ시험할 목적으로 복제하는 경우(정당한 권한에 의하여 프로그램을 이용하는 자가 해당 프로그램을 이용 중인 때에 한한다)
 

 

 

3. 정적 분석 vs 동적 분석  

(1) 정적 분석 ( Static Analysis ) 

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

 필요조건 

 

  • 실행 파일을 구성하는 모든 요소 / 대상 실행 파일이 실제로 동작할 CPU Achitecture에 해당하는 어셈블리 코드에 대한 이해

 

(2) 동적 분석 ( Dynamic Analysis )

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

 필요조건 

 

  • 환경에 맞는 디버거( Dibugger )를 이용해 단계별로 분석하는 기술(실행 단계별로 자세한 동작 과정을 살펴보기 위함)

 

 

4. Code Compile 과정  

(1) Source Code -> Binary Code

 소스 코드 ( Source Code ) : 

  • 사람이 이해하고 사용하여 프로그래밍 할 수 있는 코드

 바이너리 코드 ( Binary Code ) : 

  • 컴퓨터가 이해할 수 있는 형태인 이진법( 0과 1 )으로 표현된 코드

 컴파일 ( Compile ) : 

  • 소스 코드를 바이너리 코드로 변환하는 과정

 컴파일러 ( Compiler ) : 

  • 컴파일 과정에 사용되는 프로그램

  • 모든 프로그래밍 언어가 컴파일러를 통해 실행 가능한 바이너리가 되진 않음
  • 그러나 대개는 단독 실행 가능한 바이너리가 되기 위해 컴파일 과정 진행함
  • 컴파일러가 소스 코드를 바이너리로 변환하기 위해서는 몇 가지 단계가 필요

 

(2) Source Code -> ??? -> Binary Code

 어셈블리 코드 ( Assembly Code ) : 

  • 컴퓨터가 이해할 수 있는 기계 코드를 사람이 알아보기 쉽게 명령어 ( Instruction ) 단위로 표현한 것

 어셈블 ( Assemble ) : 

  • 최종적으로 어셈블리 코드가 기계 코드로 번역되는 과정

  • 원본 소스 코드는 각종 주석이나 매크로 또는 참조할 헤더 파일을 포함 -> 실제 코드가 아님
  • 컴파일러는 이를 모두 미리 처리하여 다음 단계에서 변환할 준비를 마침 -> 중간 언어
  • 중간 언어를 컴파일러가 분석 및 최적화 하여 어셈블리 코드 ( Assembly Code )로 생성
  • 어셈블리 코드와 기계 코드는 1:1 대응이 가능
  • 어셈블 과정을 거쳐 실행 가능한 바이너리 완성

 

(3) Binary Code -> ??? -> Source Code

 디스어셈블 ( Disassemble ) : 

  • 바이너리 코드를 어셈블리 코드로 변환하는 과정

  • 바이너리 분석을 통해 동작 방식, 바탕이 된 소스 코드를 알아내기 위해 컴파일러 수행 과정을 역으로 진행해야 함
  • 주어진 바이너리를 어셈블리 코드로 변환
  • 변환된 어셈블리 코드를 분석하여 바이너리 동작 방식 파악

 


정적 분석 방법 / 소프트웨어 엔지니어링 에서의 리버싱이란

디스어셈블을 거쳐 나온 어셈블리 코드를 분석하여 소프트웨어의 동작 구조를 알아내는 과정을 뜻함

 

따라서 리버싱에서 중요한 것 -> 어셈블리 코드를 이해 하는 것


 

 

 

 

이미지, 내용 출처 : 리버싱 엔지니어링이란 (DreamHack, dreamhack.io/learn/19)

법령 출처 : 국가법령정보센터 (www.law.go.kr/)

 

'Study > DreamHack : Pwnable' 카테고리의 다른 글

[5] puts("hello world!\n"); → x86_64 asm  (0) 2021.06.14
DreamHack 수강 커리큘럼  (0) 2021.05.15
[4] Web Hacking  (0) 2021.05.13
[3] x64 기초 ( feat. 어셈블리 코드 )  (0) 2021.05.12
[1] 시스템 해킹 기초  (1) 2021.05.11