LD_LIBRARY_PATH을 이용한 후킹법
LD_LIBRARY_PATH을 이용한 후킹법,후킹,리눅스
임베디드나 리눅스에서 디버깅/수정할 때, 중간에 함수 값을 바꿔치기 하는 작업이 필요할 때가 많다.
예를 들어:
- 버그가 있는 공유 라이브러리를 수정하고 싶다
- 기존 프로그램에 기능을 "살짝" 추가하고 싶다
- 실행 중 특정 함수의 결과를 조작하고 싶다
이럴 때 가장 흔하게 사용하는 기법 중 하나가 바로 후킹(Hooking)이다.
그중 가장 간단한 방법은 바로 LD_LIBRARY_PATH
를 이용하는 방식이다.
LD_LIBRARY_PATH란?
LD_LIBRARY_PATH
는 리눅스에서 실행 시 동적 라이브러리를 찾는 경로를 지정하는 환경 변수이다.
쉽게 말해:
"야 실행기야, 기본 경로에 라이브러리가 없으면 여기서도 찾아봐!"
💡 시나리오: 라이브러리 함수 후킹하기
이번 실습에서는 다음 시나리오로 실험을 진행한다.
victim
이라는 실행 파일이 있고, 이건real_lib
의greet()
라는 함수를 사용한다.
우리는 이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 헤더 분석