[LOB] skeleton -> golem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /* 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)); } | cs |
1) egghunter가 없다 -> 환경변수 사용가능
2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합
3) stack destroyer ! -> 스택을 모조리 초기화시켜버림
ret에 스택내의 주소를 덮어야하는데 스택을 몽땅 초기화시켜버려 답이 없는듯 보이지만 환경변수를 못쓰는 제약을 풀어놓아서 LD_PRELOAD 라는 환경변수를 이용하면 된다
프로그램이 실행될 때 일반적으로 정의되어있는 공유라이브러리를 참조하는데 공유라이브러리 파일을 만들어LD_PRELOAD라는 환경변수에 정의하면 이를 먼저 참조한다. 이 과정에서 찌꺼기가 남게 되는데 이를 이용하면 쉘을 딸 수 있다
*공유라이브러리를 사용하는 이유? : 여러 함수가 내장되어있는 공유라이브러리를 메모리에 올려놓으면 여러 프로그램이 동시에 활용할 수 있기 때문에 디스크공간과 메모리공간을 절약할 수 있다
touch test.c로 파일생성뒤 gcc로 컴파일하는데 이름은 NOP+쉘코드로 한다
그리고 LD_PRELOAD 환경변수도 같은 이름으로 정의한다
이제 프로그램이 실행될 때 LD_PRELOAD 를 먼저 참조하고 stack destroyer 뒤에도 쉘코드가 스택에 존재하게 될 것이다
gdb로 분석해보자
? 없네.. 좀더 뒤에서 찾아봐야겠다
x50x $esp-4000으로 노가다뛰어서 찾으니 NOP이 나왔다
0xbffff60c로 공격하자
페이로드와 Password
'System > LOB' 카테고리의 다른 글
[LOB] golem -> darkknight (0) | 2015.04.11 |
---|---|
함수의 프롤로그(prologue) 및 에필로그(epilogue) (0) | 2015.04.10 |
[LOB] vampire -> skeleton (0) | 2015.04.01 |
[LOB] troll -> vampire (0) | 2015.04.01 |
[LOB] orge -> troll (0) | 2015.04.01 |