본문 바로가기

Programming

About LD_PRELOAD

1. 리눅스에서 환경변수는 해당 터미널 사용자가 프로그램을 실행할때만 적용됨

즉 내가 사용중인 bash 쉘만 알고있는 내용이라고 보면됨. 따라서 환경변수를 이용해서

시스템 전체에 영향을 주는 공격은 할수없을듯.

 

2. 환경변수를 설정하면 OS 가 그 설정에따라 뭔가 해주는게 아니라 프로그램이

환경변수를 읽어와서 옵션대로 뭔가를 함.  보통 dynamic linker 가 환경변수를 참조해서

PATH 등을 보거나 함.

 

3. LD_PRELOAD 에 경로를 설정하면 dynamic linker 가 해당 경로의 so 파일을

공유 라이브러리로 무조건 선적재함.  나중에 같은이름의 다른게 올라와도 무시됨.

따라서 이걸이용하면 시스템콜후킹이 가능함.  눈치못채게 후킹하려면 본래함수를

찾아야하는데 보통 메모리를 스캔해서 찾음. 아무튼 이게 모든경우에 다먹히면

너무 말이안됨... 그래서 dynamic linker 는

guid() != geteuid() 인 경우 대부분의 환경변수들 세팅을 무시함.

즉 LD_PRELOAD 를 사용해서 자기 프로그램은 마음껏 주무르되

setuid 걸린건 못건든다는것임.

 

4. LD_DEBUG=files 이렇게 환경변수를 설정하면 프로그램실행할때

갖가지 디버깅 메시지들이 나옴.

 

5. strace 로 프로그램을 실행하면 해당 프로그램에 걸린 setuid 가 무시됨

왜그런지 아직모름.  내가 직접 execve 나 fork 로 다른 프로세스를

차일드로 오픈하고 setreuid 로 이것저것 해보고 난리를 쳐봐도 setuid 가 무시되지 않는데

strace 로 실행하면 왜 무시되는지 모르겠음;; 아무튼 여기서 LD_PRELOAD 를

악용할수 있음.  즉 strace 로 프로그램을 실행시키고 LD_PRELOAD 에 후킹라이브러리를

설정해주면 setuid 가 걸린 프로그램의 시스템콜을 후킹할수있음.

단 이때 권한이 setuid 가 걸린 권한이 아니지만...

이걸 이용하면 x 권한밖에 없는 바이너리에 대해서 메모리 읽고쓰기가 가능해짐.(메모리에 권한이 있을때만)

 

6. 보통 ELF 가 처음 로딩되는 베이스주소는 0x08048000 임.

 

7. 리눅스의 메모리페이지크기는 보통 4096이고

getconf PAGE_SIZE 명령으로 알아낼수있음.

 

8. system 은 fork 로 차일드프로세스를 만든다음 그것을 execve 로 원하는 프로세스로 바꿔주고

부모프로세스는 차일드가 끝나기를 기다리는 형태임

 

9. etc/shadow 를 setuid 가 걸린 프로그램에서 system 출로 보면 보이는데, execve 로 보면

퍼미션 에러남.  하지만 id 명령을 해보면 둘의 결과가 동일함.  왜이럴까?

 

10. so 컴파일하는방법

 

gcc -fPIC -c -o hooker hooker.c

gcc -shared -W1,-soname,libhooker.so.0 -o libhooker.so hooker

'Programming' 카테고리의 다른 글

Linux x64 system call table  (0) 2013.07.17
Linux configuration stuff  (0) 2013.07.10
Role of setuid  (0) 2013.07.10
Kernel module symbol reference  (0) 2013.07.10
Linux x86 system call table  (0) 2013.07.10