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);
: 컴파일러가 소스 코드를 어셈블리어로 컴파일 하기 전 가공 과정
#define
으로 정의한 매크로를 그 값으로 치환함의 단계를 거침
...
#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
가 사람짐add.h
의 내용이 병합: C로 작성된 코드를 어셈블리어로 변역, 이과정에서 문법을 검사해 오류가 있으면 컴파일 에러를 띄움
: 컴파일로 생성된 어셈블리어 코들르 ELF평식의 object file로 변환
-> 기계어로 번역되어 해석하기 어려워짐!
: 어러개의 obejct file들을 연결 >> 실행가능한 바이너리로 만드는 과정
#include <stdio.h>
int main() { printf("Hello World!"); }
위 코드에서 printf
함수를 호출하는데 이 함수에 대한 정의는 해당 파일에 없고 공유 라이브러리에 있음
.>> 링커가 함수가 실행될 수 있도록 공유 라이브러리를 연결해줌
기계어를 사람이 읽긴 어렵기 때문에
디스어셈블, 어셈블의 역과정을 거쳐 어셈블리어를 얻음
어셈블리어보다 고급언어로 바이너리를 번역
.>> 소스코드를 완벽히 번역하진 못하지만 리버싱 과정에서 효율을 높혀줌!
(ex. IDA Freeware)