
/*
The Lord of the BOF : The Fellowship of the BOF
- skeleton
- argv hunter
*/
#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]));
}
코드를 살펴보면, egghunter, bufferhunter, ultra argv hunter, \xbf 정도가 있고,
추가된 것은 ultra ~ 인것 같은디 딱히 어려워 보이진 않는다.
argv[1]은 48자가 최대고, buffer 와 argv모두 0으로 초기화되므로 풀 방법이 생각나질 않는다.
일단 disas, b걸어서 혹시라도 남아있는 값이 있는지 확인해보자.
break를 leave쪽에다가 걸어주고, esp를 살펴보다가,

찾았다 요놈

근데 솔직히 argv[0] 쪽 데이터가 남는다는 사실을 모른다고 가정하고 이 문제를 풀면 진짜 산으로 갈 것 같다.
쨋든 0xbfffffe5 주소에 실행파일의 경로가 남아있으므로, 심볼릭 링크를 생성해주면 간단히(?) 해결될 것 같다.
아 맞다 bash2

0xbfffffe8,

같네
페이로드를 작성하니깐 seg에러가 떠서, 선배한테 질문하니깐 파일 이름이 달라서(길이) 주소가 달라질수도 있다고 한다.
그러면 주소를 다시 구해보자.

복사한 ckeleton 파일의 이름을 수정한 뒤 코어에서 주소를 찾아보면

여기 있고

이렇게 풀린다.