⊙ 문제의 소스를 보자) |
[troll@localhost troll]$ cat vampire.c /* The Lord of the BOF : The Fellowship of the BOF - vampire - check 0xbfff */
#include <stdio.h> #include <stdlib.h>
main(int argc, char *argv[]) { char buffer[40];
if(argc < 2){ printf("argv error\n"); exit(0); }
if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); }
// here is changed! if(argv[1][46] == '\xff') { printf("but it's not forever\n"); exit(0); }
strcpy(buffer, argv[1]); printf("%s\n", buffer); } |
1) if문을 통해 argv[1][47] != "\xbf" 체크. |
♧ 스택 주소공간은 "0xbfff~"로 하향 성장 한다. [ 참조 ]
♧ argv[1][46]에 "\xff"가 되지 않도록 하기 위해서 실행 인자를 통해 길이를 늘려 조작한다.
※ 단, 길이를 조작 할 때 너무 큰 값을 주면 "Argument list too long" 에러 메시지가 출력된다. |
|
∑ 익스 플로잇 작성! | ||||||||||
※ 여기선 NOP썰매를 사용 할 필요는 없지만 GDB로 RET주소를 확인 할 경우 오차를 줄이기 위해 사용.
② 컴파일후 임의의 값으로 실행.
③ RET주소 변경.
④ ∑xploit
|
♣ 기타 사항 |
ⓐ GDB로 RET 주소 확인 & ∑xploit
ⓑ GDB로 확인한 argv[2] 주소값 :: [ 0xbfffec3b4 ] ⓒ 실제 주소와 GDB로 확인한 주소값 차이 :: [ 2 ] = [ 0xbfffec3b4 ] - [ 0xbfffec3b2 ] |
※ 사전에 chsh명령 -> bash2로 사전 변경후 재로그인 함.
troll : "aspirin"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL11] skeleton -> golem (stack destroyer) (0) | 2011.06.08 |
---|---|
[LEVEL10] vampire -> skeleton (argv hunter) (0) | 2011.06.07 |
[LEVEL8] orge -> troll (check argc) (0) | 2011.06.04 |
[LEVEL7] darkelf -> orge (check argv[0]) (0) | 2011.06.02 |
[LEVEL6] wolfman -> darkelf (check length of argv[1] + egghunter + bufferhunter) (0) | 2011.06.02 |