Binary & Analysis

Evie·2023년 9월 6일
0

시스템

목록 보기
15/22

Dreamhack 리버싱 커리큘럼 공부를 정리한 글입니다🤓

📃컴파일 과정

일반적으로 C언어로 작성된 코드는 아래의 과정을 거쳐 바이너리로 변역됨

[예시코드]

//add.c
#include "add.h"

#define HI 3

int add(int a, int b) { return a+b+HI; }
//return a+b
//add.h
int add(int a, int b);

전처리

: 컴파일러가 소스 코드를 어셈블리어로 컴파일 하기 전 가공 과정

  1. 주석제거
  2. 매크로 치환
    : #define으로 정의한 매크로를 그 값으로 치환함
  3. 파일 병합

의 단계를 거침

...
#1 "add.c"
#1 "add.h" 1
int add(int a, int b);
#2 "add.c" 2


int add(int a, int b) {return a+b+3; }
  • 주석이었던 // return a+b 가 사람짐
  • HI 가 3으로 치환
  • add.h 의 내용이 병합

컴파일 (Compile)

: C로 작성된 코드를 어셈블리어로 변역, 이과정에서 문법을 검사해 오류가 있으면 컴파일 에러를 띄움

어셈블 (Assemble)

: 컴파일로 생성된 어셈블리어 코들르 ELF평식의 object file로 변환
-> 기계어로 번역되어 해석하기 어려워짐!

: 어러개의 obejct file들을 연결 >> 실행가능한 바이너리로 만드는 과정

링크가 필요한 이유는? 🧐

#include <stdio.h>

int main() { printf("Hello World!"); }

위 코드에서 printf 함수를 호출하는데 이 함수에 대한 정의는 해당 파일에 없고 공유 라이브러리에 있음
.>> 링커가 함수가 실행될 수 있도록 공유 라이브러리를 연결해줌


디스어셈블

기계어를 사람이 읽긴 어렵기 때문에
디스어셈블, 어셈블의 역과정을 거쳐 어셈블리어를 얻음

디컴파일

어셈블리어보다 고급언어로 바이너리를 번역
.>> 소스코드를 완벽히 번역하진 못하지만 리버싱 과정에서 효율을 높혀줌!
(ex. IDA Freeware)


📃 동적분석과 정적분석

  • 정적분석
    : 외적인 관찰만으로 정보를 알아내기
    - 전체구조 파악 쉬움
    - 환경 제약 / 악성 프로그램의 위협에서 자유로움
    BUT, 난독화 분석 어렵고 다양한 동적 요소를 고려하기 어려움
  • 동적분석
    : 실행을 통해 동작을 분석
    - 코드를 분석하지 않고도 동작 파악가능
    BUT, 분석환경 구축의 어려움 존재
profile
공부합시다

0개의 댓글