LEVEL7 (darkelf -> orge) : check argv[0]
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에 넣어 공격을 성공하였다.