티스토리 뷰
skeleton.c
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i, saved_argc;
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);
}
// argc saver
saved_argc = argc;
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
// ultra argv hunter!
for(i=0; i<saved_argc; i++)
memset(argv[i], 0, strlen(argv[i]));
}
skeleton은 argv를 모두 비워버렸다.
처음엔 saved_argc의 값을 바꿔 argv가 모두 지워지지 않게 해보려 했으나 실패했다.
그래서 메모리를 비우고도 쓰레기값으로 남아있는 실행파일 경로와 이름을 이용하여 공격하기로 했다. 우선, 파일 이름을 mv를 이용하여 쉘코드로 바꾼 뒤 gdb를 이용하여 저장된 주소값을 찾았다.
일단, 모든 memset이 끝난 후로 브레이크 포인트를 잡고 `perl -e 'print "\x90"x44,"\xbf\xbf\xbf\xbf"`를 넣어 실행시켰다.
그런 다음 찾아보았다.
0xbfffffdd 부분에 남아있는 것을 확인 할 수 있었다.
실행 파일의 경로와 실행파일 이름이 남아있는 것으로 예상되는 주소: 0xbfffffdd
찾은 주소를 이용하여 공격을 하였다.
하지만 실패하였다.
그래서 주소를 올려가면서 하나하나 시도해 보기로 했다.
그 결과 0xbfffffe9에서 성공하였다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL12 (golem -> darkknight) : sfp (0) | 2013.07.19 |
---|---|
LEVEL11 (skeleton -> golem) : stack destroyer (0) | 2013.07.19 |
LEVEL9 (troll -> vampire) : check 0xbfff (0) | 2013.07.19 |
LEVEL8 (orge -> troll) : check argc (0) | 2013.07.19 |
LEVEL7 (darkelf -> orge) : check argv[0] (0) | 2013.07.19 |
- Total
- Today
- Yesterday