본문 바로가기
게임해킹/knockon 부트캠프

[3주차 TIL] KnockOn Bootcamp - 링커와 로더

by HHack 2025. 4. 22.
반응형

📘링커와 로더 – 실행파일이 메모리에서 살아나는 과정


🔍 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)

✅ 정리

  • 링커는 여러 개의 목적 파일과 라이브러리를 연결해 실행파일을 만든다.
  • 로더는 실행파일을 메모리에 올리고 그 구조를 분석해 실행을 시작한다.
  • 리버싱할 때는 링커가 만들어낸 구조와 로더가 메모리에 올린 구조를 동시에 이해하고 추적해야 한다.
  • 정적 링킹은 분석이 쉽고, 동적 링킹은 유연하지만 분석 난이도가 높아진다.

📌 실전 과제

  1. gcc -static과 기본 gcc로 만든 바이너리의 크기/동작/의존성 비교
  2. ldd, objdump -x, readelf -d를 이용해 .so 또는 .dll 의존성 추적
  3. IDA/Ghidra에서 Import Table의 LoadLibraryA, GetProcAddress 추적하기
  4. PE 구조, Import Table 분석, 혹은 동적 분석에서 라이브러리 추적 방법

 

반응형