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 |