# LD_PRELOAD
프로세스 실행 과정 중 라이브러리를 로딩할 때, LD_PRELOAD 변수가 설정되어 있다면 해당 변수에 지정된 라이브러리를 먼저 로딩하고, 이 중 libc 함수명과 동일한 함수가 있다면 해당 함수를 먼저 호출해 준다.
이러한 특성을 이용하여 후킹이 가능하다.
but, LD_PRELOAD 는 setuid 가 걸려 있거나 다른 소유자의 파일의 경우 영향을 줄 수 없는 등의 제한 사항이 있다.
# OS 별 PRELOAD 환경변수
Linux : LD_PRELOAD
AIX : LDR_PRELOAD
Solaris : LD_PRELOAD
FreeBSD : LD_PRELOAD
# test
# [*] LD_PRELOAD TEST!!
# fopen success...!
컴파일하여 실행하면 "test.txt" 파일이 존재하기에 위와 같은 문자열을 출력한다.
위에서 설명했지만, LD_PRELOAD 에 지정된 라이브러리를 먼저 로딩한다. fopen() 함수를 예를 들자면,
FILE* fopen(const char* filename, const char* mode) {
... // 지정된 파일을 정의된 모드로 열어주는 소스코드
}
fopen() 함수는 위와 같이 되어 있을 것이다.
FILE *fopen(const char* filename, const char* mode) {
printf("[!] LD_PRELOAD Success\n");
}
만약 위와 같이 fopen() 함수를 사용 시 "[!] LD_PRELOAD Success" 문자열을 출력하도록 만든 후, 공유라이브러리로 컴파일하고 LD_PRELOAD 환경변수에 등록하면 어떻게 될지 확인해보자.
# cat f_fopen.c
#include <stdio.h>
FILE* fopen(const char* filename, const char* mode) {
printf("[!] LD_PRELOAD Success\n");
}
# gcc -Wall -fPIC -shared -o fopen.so f_fopen.c // 공유 라이브러리 생성
# export LD_PRELOAD=./fopen.so // LD_PRELOAD 환경변수에 fopen.so 공유라이브러리 등록
# ./test
[*] LD_PRELOAD TEST!!
[!] LD_PRELOAD Success
fopen() fail...
fopen() 함수가 사용자가 만든 fopen() 함수로 바뀐 것을 확인할 수 있다.
'system' 카테고리의 다른 글
Back(` `) , Single(' '), Double(" ") Quotes, Blackslash(\) (0) | 2016.11.04 |
---|---|
stdin 임시버퍼 (0) | 2016.10.11 |
ctors, dtors section (0) | 2016.09.30 |
core dump 생성 (0) | 2016.07.28 |
fake ebp 기법 (0) | 2016.05.31 |