LD_PRELOAD에 대해 ARABOZA
LOB 문제를 풀다 처음 알게 되어서 정리를 해봤습니다.
아, 환경마다 PRELOAD 환경 변수 이름이 다르더라구요.
뭐 사실상 AIX 빼고는 다 이름이 같습니다.
what is LD_PRELOAD ?
프로세스를 실행하는 중에 라이브러리를 로딩할 때,
이 LD_PRELOAD 환경변수가 설정되있으면 해당 변수에 지정된 라이브러리를 먼저 로딩을 하고,
이 중에 libc 함수명과 동일한 함수가 있다면 해당 함수를 먼저 호출을 해주게 됩니다.
where is LD_PRELOAD ?
LD_PRELOAD의 메모리 영역은 공유 라이브러리 영역에 존재해서 stack 영역보다 낮은 주소에 존재합니다.
Let's compile shared library!
.so로 컴파일 하기 위해서는 아래와 같은 옵션을 넘겨주어야됩니다.
-Wall 옵션 : 모든 경고 메세지를 출력 (사실 상 안넘겨주어도 되는 옵션입니다.)
-fPIC 옵션 : Position-Independent Code의 약자이며 test.o파일을 동적라이브러리로 사용하도록 컴파일 하는 옵션이다.
-shared 옵션 : 공유 라이브러리를 만드는 옵션
$ gcc -Wall -fPIC -shared -o filename.so filesource.c
같이 공유 라이브러리를 컴파일 할 수 있습니다.
Modify LD_PRELOAD
초 간단합니다.
$ export LD_PRELOAD="./filename.so"
Fun it !
그렇다면 이 LD_PRELOAD를 이용하여 후킹을 해보도록 하겠습니다.
hostname 명령어는 말 그대로 호스트네임의 값을 출력해주는 명령어입니다.
gethostname를 만들면 되겠네요!
#include <stdlib.h>
#include <string.h>
int gethostname(char *name, size_t len)
{
strncpy(name, "HOOKHOOK", len-1);
name[len-1] = '\0';
return 0;
}
$ gcc -shared -fPIC -o hook.so a.c
컴파일을 하신 뒤,
LD_PRELOAD에 직접 만든 라이브러리 경로를 넘겨주고!
실행을 하게 되면.
잘 된 것을 볼 수 있습니다!
하지만, 중요한 것은 LD_PRELOAD는 setuid가 걸려있으면 동작을 하지 않습니다.
'0x20 Security > 0x21 System' 카테고리의 다른 글
Save Frame Pointer Overwrite (SFO) (0) | 2016.07.25 |
---|---|
Buffer Overflow (BOF) (2) | 2016.07.22 |
Use After Free (UAF) (1) | 2016.07.13 |
How main() is executed on linux (2) | 2016.07.04 |
System Hacking :: Memory Protection (0) | 2016.06.28 |