개인정리

LD_PRELOAD 후킹

T3RR3T 2017. 8. 7. 00:18

※ LD_PRELOAD

프로세스 실행 과정 중 라이브러리를 로딩 할 때, LD_PRELOAD 변수가 설정되어 있으면 해당 변수에 지정된 라이브버리를 먼저 로딩하고, 이 중에 libc 함수명과 동일한 함수가 있다면 해당 함수를 먼저 호출한다.


하나의 코드를 예시로 들겠다.


Copy.c

#include <stdio.h>


int main() {

FILE * fd = NULL;

printf("Call fopen()");

fd = fopen("test.txt", "r");

printf("Load OK");

return 0;

}


위와 같은 코드에서 fopen을 호출을 할 때 LD_PRELOAD가 적용이 되어있다면 적용된 환경변수가 라이브러리보다 우선 로딩이 되는것을 확인 할 수 있을 것이다. 직접 fopen에 대한 LD_PRELOAD를 적용할 파일을 컴파일 해보도록 하겠다.


hook.c

#include <stdio.h>


FILE * fopen(const char* path, const char* mode)

{

printf("Hooking Success!!");

return NULL;

}

컴파일 옵션 : gcc -fPIC -shared -0 hook.so hook.c


위의 파일을 컴파일하여 생성된 hook.so를 LD_PRELOAD환경변수에 등록을 한다.

export LD_PRELOAD=/t3rr3t/hook.so


export를 시킨 후 copy.c가 컴파일된 실행 파일을 실행하여 보면 fopen함수가 LD_PRELOAD에서 우선적으로 불러와지며, "Hooking Success!!"라는 문구가 출려되는 것을 확인 할 수 있다.


실제로 다른 라이브러리 보다 LD_PRELOAD환경변수를 설정할 경우 LD_PRELOAD에 설정된 라이브러리가 가장먼저 적재되도록 설계되어있다. 이러한 방식으로 후킹을 쉽게 할 수 있지만 setuid가 걸린파일이나 다른 소유자의 파일일 경우는 사용할 수 없는 제약이 따른다.

'개인정리' 카테고리의 다른 글

fgets, atoi, fread  (0) 2017.08.06