본문 바로가기

system

LD_PRELOAD

# 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