티스토리 뷰
orge.c
#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);
}
// here is changed!
if(strlen(argv[0]) != 77){
printf("argv[0] 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]);
// buffer hunter
memset(buffer, 0, 40);
}
orge에서는 argv[0]의 길이가 77개여야 했다.
우선, argv[0]에 무엇이 들어있나 찾아보았더니 실행파일의 경로와 파일이름이 저장되어 있다고 했다. 그래서, /home/darkelf/orge를 77개로 맞춰주기 위해 orge의 경로를 /home/darkelf/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/orge 로 해주어 실행시켜 보았지만 argv[0] error가 떴다. 그래서 argv[0]을 출력해 보았더니
경로가 들어가 있지 않고 실행파일 이름만 ./orge 형태로 뜨는 것을 볼 수 있었다.
디렉토리를 만들고 지우던 과정에서 실수로 orge의 파일이름을 org로 바꿨는데 권한도 그대로 있고 이름이 바뀌어있는 것을 볼 수 있었다.
그래서 실행파일이름을 orgeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee로 바꿔 주소를 찾기로 했다.
공격은 이전과 같이 argv[2]에 쉘코드를 넣고 argv[2]의 주소를 찾아 ret에 넣는 방식으로 공격을 하였다.
실행파일 이름을 맞춰 argv[2]의 주소를 출력하는 Orge..를 만들어 argv[2]의 주소를 찾았다.
그 다음, argv[2]에 쉘코드를 넣고 찾은 argv[2]의 주소를 ret에 넣어 공격을 성공하였다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL9 (troll -> vampire) : check 0xbfff (0) | 2013.07.19 |
---|---|
LEVEL8 (orge -> troll) : check argc (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 |
LEVEL4 (goblin -> orc) : egghunter (0) | 2013.07.19 |
- Total
- Today
- Yesterday