티스토리 뷰
vampire.c
#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);
}
vampire의 경우에는 \bf와 \xff를 검사하였다.
어떻게 할까 고민하고 있는데 기성오빠가 argv[2]에 nop를 많이 넣고 쉘코드를 넣어서 \xff\xfe 지점을 리턴으로 하는게 어떻냐고 해서 시도를 했지만 계속 실패하였다.
왜 그럴까 생각을 하다가 argv[2]가 argv[3]보다 낮은주소에 위치한다는 것을 깨달았다.
그렇다면 argv[3]에 nop를 많이 넣어 argv[2]에 쉘코드를 넣고 argv[2]의 주소를 낮춰 argv[2]의 주소가 \xbf\xfe 로 시작할 때 ret를 argv[2]의 주소로 바꿔 리턴하게 하면 되지 않을까 ? 라는 생각을 하게 되었고 공격을 하였다.
먼저, argv[2]의 주소가 \xbf\xfe가 될 때까지 argv[3]에 nop를 늘려가면서 넣어보았다.
nop를 70000개 넣었을 때 argv[2]의 주소가 bffeeb14로 바뀌는 것을 볼 수 있었다.
argv[2]의 주소 : bffeeb14
ret에 아까 찾은 argv[2]의 주소를 넣고 argv[2]에 쉘코드를 넣은 뒤 argv[3]에 똑같이 nop를 70000개 넣었더니 성공했다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL11 (skeleton -> golem) : stack destroyer (0) | 2013.07.19 |
---|---|
LEVEL10 (vampire -> skeleton) : argv hunter (0) | 2013.07.19 |
LEVEL8 (orge -> troll) : check argc (0) | 2013.07.19 |
LEVEL7 (darkelf -> orge) : check argv[0] (0) | 2013.07.19 |
LEVEL6 (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter (0) | 2013.07.19 |
- Total
- Today
- Yesterday