2 min read

LD_LIBRARY_PATH을 이용한 후킹법

LD_LIBRARY_PATH을 이용한 후킹법,후킹,리눅스

임베디드나 리눅스에서 디버깅/수정할 때, 중간에 함수 값을 바꿔치기 하는 작업이 필요할 때가 많다.
예를 들어:

  • 버그가 있는 공유 라이브러리를 수정하고 싶다
  • 기존 프로그램에 기능을 "살짝" 추가하고 싶다
  • 실행 중 특정 함수의 결과를 조작하고 싶다

이럴 때 가장 흔하게 사용하는 기법 중 하나가 바로 후킹(Hooking)이다.
그중 가장 간단한 방법은 바로 LD_LIBRARY_PATH를 이용하는 방식이다.


LD_LIBRARY_PATH란?

LD_LIBRARY_PATH는 리눅스에서 실행 시 동적 라이브러리를 찾는 경로를 지정하는 환경 변수이다.
쉽게 말해:

"야 실행기야, 기본 경로에 라이브러리가 없으면 여기서도 찾아봐!"

💡 시나리오: 라이브러리 함수 후킹하기

이번 실습에서는 다음 시나리오로 실험을 진행한다.

victim이라는 실행 파일이 있고, 이건 real_libgreet()라는 함수를 사용한다.
우리는 이 greet() 함수를 **가짜 라이브러리(fake_lib)**로 바꿔치기해서,
출력 결과를 조작한다.

📦 프로젝트 구조

git clone https://git.kudryavka.me/blog/ld_path_hack_demo.git
cd ld_path_hack_demo
ld_path_hack_demo/
├── CMakeLists.txt
├── fake_lib
│   ├── CMakeLists.txt
│   └── mylib.cpp           👈 우리가 만든 가짜 라이브러리
├── real_lib
│   ├── CMakeLists.txt
│   └── mylib.cpp           👈 원래 victim이 사용하는 라이브러리
├── victim
│   ├── CMakeLists.txt
│   ├── main.cpp            👈 실제 실행파일
│   └── mylib.h

🧪 목표: greet() 함수 출력을 이렇게 바꾸자

// fake_lib/mylib.cpp
#include <iostream>
void greet() {
    std::cout << "❌ HACKED: This is the fake library!" << std::endl;
}

🛠️ 빌드 및 실행

# 1. 빌드
mkdir build && cd build
cmake ..
cmake --build .

# 2. 정상 실행
./victim/victim
# → ✅ Hello from the real library!

# 3. 해킹 시뮬레이션
mv real_lib/libmylib.so real_lib/libmylib_  # 원래 라이브러리 잠깐 이름 바꾸기
LD_LIBRARY_PATH=./fake_lib ./victim/victim
# → ❌ HACKED: This is the fake library!

🔍 분석: 왜 바꿔치기가 성공했을까?

victim 실행파일은 실행될 때 libmylib.so를 동적으로 로딩한다.
이때 LD_LIBRARY_PATH./fake_lib를 넣어줬기 때문에:

동적 링커(ld.so)는:
→ fake_lib/libmylib.so (가짜)
→ real_lib/libmylib.so (진짜, 그러나 이름 바꿨음)

순서로 라이브러리를 찾게 되고, 결국 가짜 greet() 함수가 실행된 다.


🛡️ 이 기법이 해킹에 악용된다면?

  • SSL 통신 라이브러리(예: OpenSSL)를 조작해서 평문을 탈취하는 일도 가능하다.

📎 관련 도구

  • readelf -d <binary>: ELF 동적 정보 확인
  • ldd <binary>: 어떤 .so를 링크하고 있는지 확인
  • patchelf: RPATH 수정용
  • objdump -p: ELF 헤더 분석