티스토리 뷰

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]);

printf("%s\n", buffer);

 

// buffer hunter

memset(buffer, 0, 40);

}

orge에서는 argv[0]의 길이가 77개여야 했다.

우선, argv[0]에 무엇이 들어있나 찾아보았더니 실행파일의 경로와 파일이름이 저장되어 있다고 했다. 그래서, /home/darkelf/orge77개로 맞춰주기 위해 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에 넣어 공격을 성공하였다.

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