리버싱 기초

2025. 1. 14. 00:54·Security/Reverse Engineering

0. 리버싱 엔지니어링(Reverse Engineering)

리버싱 엔지니어링이란 완성된 시스템, 소프트웨어, 기계 또는 제품을 분석하여 구조, 기능, 동작 방식을 파악하고 이를 통해 설계나 구현방식을 이해하는 과정을 말한다. 용어 그대로 "거꾸로" 분석하여 어떻게 만들어졌는지 알아내는 작업이다.

 

소프트웨어를 리버싱한다고 했을 때, 이는 실행 파일(바이너리 파일)을 분석하여 원본 소스 코드, 로직, 데이터 구조, 프로토콜 등을 알아내는 것이다. 이 과정속에서 디컴파이얼러, 디버거, 패킷 분석기와 같은 도구들이 사용된다.

 

리버싱의 주요 용도는 다음과 같다.

 

1. 소프트웨어 디버깅 및 오류 수정 : 소스 코드가 없는 상황에서 소프트웨어의 문제를 파악하고 수정하는 데 사용되며 특히 오래된 소프트웨어나 소스 코드가 유실된 경우 유용하다.

 

2. 보안 취약점 분석 : 악성코드를 분석하여 동작 원리를 파악하고 대응책을 마련하기 위해 사용된다.

 

3. 호환성 확보 및 상호운용성 지원 : 새로운 소프트웨어가 기존 시스템과 호환되도록 하기 위해 기존 시스템의 동작 원리를 파악하는 데 사용된다.

 

4. 교육 및 연구 : 소프트웨어 및 하드웨어의 동작 방식을 배우고 이를 기반으로 새로운 기술을 개발하기 위해 사용된다.

 

5. 지적 재산권 및 라이센스 검증 : 소프트웨어의 불법 복제 여부를 확인하거나, 상용 소프트웨어에서 라이센스 위반 여부를 파악하기 위해 사용된다.

 


 

1. 프로그램

프로그램이란 컴퓨터가 특정 작업을 수행하도록 명령을 작성한 코드의 집합을 말한다. 꼭 크롬, 파이어폭스와 같은 웹 브라우저나 리그 오브 레전드, 배틀그라운드와 같은 게임을 말하는 것이 아닌 윈도우나 리눅스처럼 컴퓨터를 돌아가게 만드는 운영체제까지 모두 포함한다.

 

이와 같은 프로그램들을 만들기 위해 사용되는 규칙과 문법의 체계가 바로 프로그래밍 언어이며 대표적인 예로는 C, C++, JAVA, Python, Javascript가 있다.

 

 

프로그래밍 언어는 저급 언어(Low-Level Language)와 고급 언어(High-Level Language)로 나눌 수 있다.

 

저급 언어는 컴퓨터 하드웨어와 밀접한 언어로, 기계어(0과 1의 이진수로 구성된 코드) 또는 어셈블리어(기계어에 약간의 사람이 이해하기 쉬운 명령어(ADD, MOV 등)를 추가한 언어)를 포함한다. 저급 언어는 사람이 읽기 어렵지만, 컴퓨터가 직접 실행할 수 있는 형태로 변환이 필요하지 않거나 변환 과정이 간단하다.

저급 언어의 특징

 

- 하드웨어 직접 제어 가능

- 실행 속도가 빠름

- 사람이 이해하고 작성하기 어려움

- 플랫폼 의존적임 

 

고급 언어는 인간이 이해하기 쉽도록 설계된 언어로, 추상화 수준이 높아 하드웨어와 독립적이다. 고급언어는 컴파일러나 인터프리터를 통해 기계어로 변환된다.

 

고급 언어의 특징

 

- 읽기 쉽고 쓰기 편함

- 하드웨어 독립적

- 실행 속도가 저급 언어에 비해 느릴 수 있음

 


 

2. Compile / Interpreting

컴파일과 인터프리팅은 프로그래밍 언어로 작성된 코드를 컴퓨터가 실행할 수 있는 기계어로 변환하는 두 가지 주요 방법이다.

 

컴파일은 프로그램의 전체 코드를 한 번에 기계로 번역한 후 실행파일(.exe, .out과 같은 파일)을 생성하는 과정이다. 이 방식은 컴파일러라는 소프트웨어에 의해 수행된다.

 

컴파일 과정은 다음과 같다.

1. 소스 코드 작성: 사람이 작성한 고급 언어로 된 코드(예: .c, .java)

2. 컴파일: 컴파일러가 소스 코드를 기계어로 번역하여 실행 가능한 바이너리 파일 생성

3. 실행: 사용자가 생성된 실행 파일을 실행

 

컴파일의 특징

 

- 빠른 실행 속도: 실행 시 컴파일이 완료된 상태이므로, 실행 파일은 바로 실행된다.

- 오류 확인: 모든 코드를 한번에 분석하므로, 실행 전에 대부분의 문법 오류를 발견 할 수 있다.

- 기계 종속성: 생성된 실행 파일은 특정 운영 체제나 하드웨어에서만 작동할 수 있다.

 

컴파일 기반 언어 예시 : C, C++, Java, Go

 

인터프리팅은 소스 코드를 한 줄씩 읽어가며 즉시 실행하는 방식을 말한다. 이 과정은 인터프리터라는 소프트웨어에 의해 수행된다.

 

인터프리팅 과정은 다음과 같다.

 

 

1. 소스 코드 작성 : 사람이 작성한 고급 언어로 된 코드(예: .py, .js)

2. 실행 : 인터프리터가 소스 코드를 읽고, 실행할 명령어를 즉시 기계어로 변환하여 실행

 

인터프리팅의 특징

 

- 느린 실행 속도 : 코드를 실행하면서 변환하므로 컴파일 방식에 비해 느릴 수 있다.

- 즉시 실행 : 소스 코드를 실행할 때 바로 결과를 확인할 수 있다.

- 오류 확인 : 프로그램 실행 도중에 오류가 발견될 수 있다.

 

인터프리터 기반 언어 예시 : Python, JavaScript, Ruby, PHP, Bash

 

 


 

3. 분석

소프트웨어나 시스템을 검토하고 문제를 발견하기 위해 사용하는 방법으로 동적 분석과 정적 분석이 있다. 이 둘은 분석이 이루어지는 시점과 분석 방식에서의 차이가 있다. 

 

동적 분석(Dynamic Analysis)이란 프로그램을 실행한 상태에서 동작을 관찰하고, 입력과 출력, 메모리 사용, 런타임 에러 등을 분석하는 방법이다. 동적 분석의 특징으로는 프로그램을 실제로 실행해야 분석이 가능하다는 점, 실행 중인 코드의 동작, 성능, 자원 사용, 보안 취약점 등을 관찰하기 위해 사용한다는 점, 메모리 누수, 런타임 에러, 실행 시간 성능 문제 등을 발견하기 위해 사용한다는 점이 있다.

 

정적 분석(Static Analysis)이란 프로그램 코드를 실행하지 않고, 소스 코드나 바이너리를 분석하여 오류, 결함, 취약점을 찾는 방법이다. 정적 분석의 특징으로는 프로그램을 실행하지 않고 코드를 분석한다는 점, 코드 구조, 문법 오류, 변수 선언 오류 등을 탐지한다는 점이 있다.

 

동적 분석과 정적 분석 비교

 


 

4. 분석 툴

디컴파일(Decompilation)이란 실행 파일(바이너리)을 고급 언어의 소스 코드와 유사한 형태로 변환하는 과정이다. 이는 소스 코드가 없는 상태에서 프로그램의 동작을 분석하거나 수정하려고 할 때 사용된다. 

 

디컴파일에 사용되는 대표적인 툴 : IDA, Ghidra, JADX, Procyon, dotPeek

 

장점

- 원래의 소스 코드와 비슷한 구조(고급 언어 형태)를 생성하므로 사람이 이해하기 쉽다.

- 고급 언어로 변환되므로 프로그램의 전반적인 동작을 분석하거나 로직을 파악하기에 좋다.

- 복원된 코드를 통해 특정 기능을 변경하거나 추가하기 쉬워진다.

 

단점

- 디컴파일 결과는 원본 소스 코드와 완전히 동일하지 않다.

- 변수명, 주석, 일부 코드 구조는 복구되지 않을 수 있다.

- 특정 언어와 컴파일러로 생성된 실행 파일에 최적화된 디컴파일러가 필요하다.

- 소스 코드를 역추적하는 행위는 라이센스나 저작권 침해로 이어질 수 있다.

 

디스어셈블(Disassembly)이란 실행 파일(바이너리)을 어셈블리 언어(저급 언어)로 변환하는 과정을 말한다. 이는 CPU 명령어 단위로 분석하므로 실행 파일의 정확한 동작을 이해할 수 있다는 특징을 가지고 있다.

 

디스어셈블에 사용되는 대표적인 툴 : IDA, Radare2, Ghidra, Hopper Disassembler, Binary Ninja

 

장점

- 실행 파일에 포함된 기계어 명령을 그대로 어셈블리 코드로 변환하므로, 원본 프로그램의 동작을 정확히 반영한다.

- 소스 코드가 어떤 언어로 작성되었든 실행 파일은 기계어로 변환되므로, 디스어셈블은 모든 실행 파일에 대해 작동한다.

- CPU 레지스터, 메모리 접근, 조건 분기 등 낮은 수준의 동작을 분석할 수 있기 때문에 보안 취약점 분석(BOF, 메모리 누수 등)에 유리하다.

 

단점

- 어셈블리 언어는 추상화 수준이 낮기 때문에 분석 작업에 시간이 많이 소요된다.

- 고급 언어의 변수명, 함수명, 논리 구조를 복구할 수 없다.

- 고급 언어의 구조(예: 반복문, 조건문 등)를 어셈블리에서 이해하기 위해서는 높은 분석력이 요구된다.

 

디컴파일과 디스어셈블 비교


 

5. 컴퓨터 구조

컴퓨터 하드웨어의 주요 구성 요소는 다음과 같다.

 

1. 중앙처리장치(CPU) : 프로그램 실행을 위한 명령어 처리와 데이터 연산 수행(연산 장치, 제어 장치, 레지스터)

2. 메모리 : 데이터를 저장하고 CPU가 필요할 때 빠르게 접근 가능(RAM, ROM 등)

3. 입출력 장치(I/O) :  키보드, 마우스, 디스플레이, 네트워크 장치 등

4. 버스(BUS) : 데이터, 주소, 제어 신호를 전달하는 통로

 

폰 노이만 구조

 

레지스터(Register)

- 레지스터란 CPU 내부에 있는 소규모 초고속 기억 장치를 말한다. 레지스터는 CPU가 작업을 수행하는 동안 임시 데이터를 저장하거나 특정 정보를 관리하는 데 사용된다.

 

레지스터의 특징

- 캐시보다 빠르며, CPU에서 가장 빠르게 접근 가능한 메모리이다.

- 용량이 작고, 보통 32비트, 64비트 단위로 나뉜다.

- 명령어 실행 시 데이터를 임시로 저장하거나 특정 상태를 유지한다.

 

레지스터의 역할 

- 명령어 실행 시, 데이터를 저장하고 처리

- 주소 계산, 데이터 전송, 상태 플래그 관리 등

 

주요 레지스터의 용도 및 쓰임새

- 범용 레지스터 (General-Purpose Register) : 일반 데이터를 저장하거나 연산에 사용, 다양한 작업(산술, 논리, 주소 계산 등)에 사용되는 레지스터

- 세그먼트 레지스터 (Segment Register) : CPU가 메모리 주소를 계산할 때, 특정 메모리 영역(세그먼트)을 관리하는 레지스터

- 명령어 포인터 레지스터 (Instruction Pointer Register) : 현재 실행 중인 명령어와 CPU가 다음에 실행할 명령어의 위치를 가리키는 레지스터

- 플래그 레지스터 (Flag Register) : 연산 결과나 CPU의 상태를 저장하는 레지스터


 

6. 어셈블리어

각 명령어는 CPU가 실행하는 기본적인 작업의 단위가 된다.

 

- 데이터 전송 및 조작

 

- 산술 연산

 

- 논리 연산

 

- 비교 및 테스트

 

- 분기 및 제어

 

- 함수 및 스택 관리

 

- 시스템 호출

'Security > Reverse Engineering' 카테고리의 다른 글

rev-basic-3 풀이  (0) 2025.02.05
리버싱 기초 문제 풀이  (0) 2025.02.04
abex-crackme#2 풀이  (0) 2025.02.04
rev-basic-2 풀이  (0) 2025.01.22
rev-basic-1 풀이  (0) 2025.01.22
'Security/Reverse Engineering' 카테고리의 다른 글
  • 리버싱 기초 문제 풀이
  • abex-crackme#2 풀이
  • rev-basic-2 풀이
  • rev-basic-1 풀이
switch_user
switch_user
나의 공부 기록
  • switch_user
    while(true)
    switch_user
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • C
      • C++
      • Java
      • Python
      • Web
      • Security
        • Web Hacking
        • Reverse Engineering
      • DB
      • Machine Learning
      • MCP N
      • Computer Science
      • Linux
      • Algorithm
      • 진로
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • velog
    • Github
  • 링크

    • velog
    • Github
  • 공지사항

  • 인기 글

  • 태그

    웹해킹
    비트연산
    반복문
    생성자와 소멸자
    쿠키
    ml
    어셈블리어
    race condition
    xss
    SQL
    Hacking Process
    cin.getline
    HTML
    사례 기반 학습
    x64dbg
    SQLi
    리버싱
    배치 학습
    코드 패치
    모델 기반 학습
    HTTP
    어셈블리
    인터프리팅
    클래스 외부에 함수 구현
    CSS
    IDA
    Web 기초
    웹
    디컴파일
    머신러닝
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
switch_user
리버싱 기초
상단으로

티스토리툴바