티스토리 뷰

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

memset(buffer, 0, 40);

 

// ultra argv hunter!

for(i=0; i<saved_argc; i++)

memset(argv[i], 0, strlen(argv[i]));

}

 

skeletonargv를 모두 비워버렸다.

처음엔 saved_argc의 값을 바꿔 argv가 모두 지워지지 않게 해보려 했으나 실패했다.

그래서 메모리를 비우고도 쓰레기값으로 남아있는 실행파일 경로와 이름을 이용하여 공격하기로 했다. 우선, 파일 이름을 mv를 이용하여 쉘코드로 바꾼 뒤 gdb를 이용하여 저장된 주소값을 찾았다.

 

일단, 모든 memset이 끝난 후로 브레이크 포인트를 잡고 `perl -e 'print "\x90"x44,"\xbf\xbf\xbf\xbf"`를 넣어 실행시켰다.

 

 

그런 다음 찾아보았다.

 

0xbfffffdd 부분에 남아있는 것을 확인 할 수 있었다.

 

실행 파일의 경로와 실행파일 이름이 남아있는 것으로 예상되는 주소: 0xbfffffdd

찾은 주소를 이용하여 공격을 하였다.

하지만 실패하였다.

그래서 주소를 올려가면서 하나하나 시도해 보기로 했다.

그 결과 0xbfffffe9에서 성공하였다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday