LD_PRELOAD는 환경변수 중 하나이다. 


프로세스를 실행하는 과정에서 라이브러리를 로딩할 때 만약 이 환경변수가 설정이 되어 있다면 해당 변수에 지정된 라이브러리를 먼저 로딩한다. 이 중 libc 함수 명과 동일한 함수가 있다면 그것을 우선적으로 호출하게 된다.


이러한 특성을 이용하여 후킹이 가능하다.



'ls' 는 현재 경로의 파일 리스트를 출력해주는 명령어이다.





해당 명령어를 호출했을 때 파일 리스트를 strcpy 함수를 사용하여 전달해주는 것을 알 수 있다.





"abc" 라는 파일이 출력되지 않도록 하기 위하여 strcpy() 함수를 조금 수정해보기로 했다.


[ mystrcpy.c ]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
char *strcpy(char *dest, const char *src){
        int i = 0;
 
        if(strcmp(src, "abc")==0){
                dest[i] = '\0';
                return &dest[0];
        }
 
        while(src[i] != '\0'){
                dest[i] = src[i];
                i++;
        }
 
        dest[i] = '\0';
 
        return &dest[0];
}
 
 
cs





작성한 c 파일을 so 라이브러리로 컴파일하였다. 그 후 해당 라이브러리 파일을 LD_PRELOAD 환경변수에 넣어 실행시켜보았다.

ls 명령어를 실행했을때 기존의 strcpy() 함수가 후킹되어 위 코드가 동작하여 "abc" 파일이 출력되지 않는 것을 확인할 수 있다.





< LD_PRELOAD 환경변수에 저장하는 여러가지 방법 >


특정 바이너리 실행 시에만 사용

LD_PRELOAD=filename  ./binary


쉘에 등록하여 사용

- 어떠한 바이너리든지 실행 시 마다 LD_PRELOAD 동작

export LD_PRELOAD=filename


/etc/ld.so.preload에 설정

- 해당 파일이 존재하지 않으면 생성해주면 된다.

- 계정에 상관없이 동작




'System' 카테고리의 다른 글

python으로 서버 시간 알아내는 방법  (2) 2018.09.10
qemu mips 실행  (0) 2018.08.20
qemu arm 실행  (0) 2018.05.10
[how2heap] fastbin_dup_into_stack  (0) 2018.02.18
[how2heap] fastbin_dup (double free bug)  (0) 2018.02.18

+ Recent posts