반응형
📘링커와 로더 – 실행파일이 메모리에서 살아나는 과정
🔍 3.1 링커(Linker)란?
💡 개념
"링커(linker)"는 컴파일된 목적 파일들(.o, .obj)을 하나의 실행 가능한 프로그램으로 결합해주는 툴이다.
링커는 외부 참조를 해결하고, 코드나 데이터의 실제 메모리 주소를 할당해주며, 최종 실행파일을 생성한다.
🔧 링커의 주요 역할
- 심볼 이름 → 실제 주소 매핑
- 라이브러리와 연결 (printf, malloc 등)
- 코드/데이터 영역 구성 (.text, .data, .bss)
- 재배치(Relocation) 처리
🔍 3.1.1 동적 링킹 vs 정적 링킹
항목 | 정적 링킹 (Static) | 동적 링킹 (Dynamic) |
시점 | 컴파일 시 | 실행 시 (런타임) |
실행 파일 크기 | 크다 (라이브러리 포함됨) | 작다 (라이브러리 분리됨) |
성능 | 빠름 | 약간 느림 |
유연성 | 낮음 | 높음 (업데이트 가능) |
분석 시 장점 | 전체 코드가 한 파일에 있음 | 동적 라이브러리 추적 필요 |
파일 예시 | libc.a (정적), a.exe | libc.so, user32.dll |
📌 리버싱에서는 정적 링킹된 실행파일이 분석이 훨씬 쉽다.
동적 링킹은 분석 대상 함수가 외부에 있어, IAT/PLT 등 테이블 추적이 필요하다.
🔍 3.1.2 재배치(Relocation)
개념
링커가 목적 파일을 연결할 때, 정확한 주소를 모르는 경우에는 임시 주소를 설정한다.
이후 실행 시 로더가 이 주소를 실제 메모리 기반으로 재계산(재배치) 해야 한다.
리버싱 관점
- reloc 섹션 분석
- ASLR이 활성화되면 실행할 때마다 베이스 주소가 달라짐
- 후킹, 패치 대상 주소가 고정되지 않음 → offset 계산 필수
🔍 3.1.3 .dll / .so 파일
항목 | 설명 |
.dll | Windows의 동적 라이브러리 파일 (Dynamic-Link Library) |
.so | Unix/Linux의 공유 오브젝트 파일 (Shared Object) |
주요 함수 | LoadLibrary, GetProcAddress (Windows), dlopen, dlsym (Linux) |
분석 위치 | Import Address Table, Global Offset Table 등 |
📌 .dll 파일 후킹이나 .so 분석은 동적 로딩 시점과 메모리 주소 재배치 타이밍이 중요하다.
🧠 3.2 로더(Loader)란?
💡 개념
로더는 운영체제 커널이 실행파일을 메모리로 적재하고 실행을 시작하는 역할을 하는 시스템 컴포넌트다.
🔧 주요 역할
- 실행 파일 포맷(PE, ELF 등) 파싱
- .text, .data 섹션 메모리 매핑
- 동적 라이브러리 로딩
- 재배치 처리
- 메인 진입점 설정 → main() or WinMain() or _start
🔍 3.2.1 동적 라이브러리 로드 과정
Windows에서 .dll 로드 예시
#include <windows.h>
int main() {
HMODULE h = LoadLibraryA("user32.dll");
FARPROC fn = GetProcAddress(h, "MessageBoxA");
((int (*)(HWND, LPCSTR, LPCSTR, UINT))fn)(NULL, "Hi", "Title", 0);
}
Linux에서 .so 로드 예시
#include <dlfcn.h>
void* handle = dlopen("./libhello.so", RTLD_LAZY);
void (*hello)() = dlsym(handle, "hello");
hello();
📌 리버싱에서는 위 함수 호출 타이밍을 감지해 동적 로딩된 .dll/.so 안의 실제 함수 주소를 추적해야 한다.
🧠 리버싱 관점 분석
대상 | 분석 포인트 |
링커 | Import Table, Symbol Table 분석 (nm, objdump, IDA 등) |
로더 | Entry Point 분석, 라이브러리 적재 지점 탐지 |
동적 링킹 | LoadLibrary, dlopen API 트레이싱 |
재배치 | 실행 시점의 실제 주소 추적 (reloc, ASLR) |
✅ 정리
- 링커는 여러 개의 목적 파일과 라이브러리를 연결해 실행파일을 만든다.
- 로더는 실행파일을 메모리에 올리고 그 구조를 분석해 실행을 시작한다.
- 리버싱할 때는 링커가 만들어낸 구조와 로더가 메모리에 올린 구조를 동시에 이해하고 추적해야 한다.
- 정적 링킹은 분석이 쉽고, 동적 링킹은 유연하지만 분석 난이도가 높아진다.
📌 실전 과제
- gcc -static과 기본 gcc로 만든 바이너리의 크기/동작/의존성 비교
- ldd, objdump -x, readelf -d를 이용해 .so 또는 .dll 의존성 추적
- IDA/Ghidra에서 Import Table의 LoadLibraryA, GetProcAddress 추적하기
- PE 구조, Import Table 분석, 혹은 동적 분석에서 라이브러리 추적 방법
반응형
'게임해킹 > knockon 부트캠프' 카테고리의 다른 글
[3주차 TIL] KnockOn Bootcamp - ELF 파일 구조 (0) | 2025.04.22 |
---|---|
[3주차 TIL] KnockOn Bootcamp - 메모리 구조와 매핑 (0) | 2025.04.22 |
[3주차 TIL] KnockOn Bootcamp - 컴파일러 (0) | 2025.04.22 |
[3주차 TIL] KnockOn Bootcamp - 아키텍쳐 (2) | 2025.04.22 |
[2,3주차 TIL] KnockOn Bootcamp - 프로젝트 만들기 (0) | 2025.04.15 |