티스토리 뷰
troll.c
#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);
memset(argv[1], 0, strlen(argv[1]));
}
troll은 argv[1]의 메모리 또한 비워버렸다.
그래서, orge처럼 실행파일 이름을 변경해 argv[0]을 이용해 풀어보기로 했다.
우선, troll을 복사한 Troll의 이름을 16byte 쉘코드로 변경 한 뒤, argv[0]의 주소값을 찾아보았다.
argv[0]의 주소 : bffffc16
troll의 이름을 똑같이 16byte 쉘코드로 변경 한 뒤, buffer와 SFP를 nop로 채우고 ret에 argv[0]의 주소를 넣어 공격하였다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL10 (vampire -> skeleton) : argv hunter (0) | 2013.07.19 |
---|---|
LEVEL9 (troll -> vampire) : check 0xbfff (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 |
LEVEL5 (orc -> wolfman) : egghunter + bufferhunter (0) | 2013.07.19 |
- Total
- Today
- Yesterday