/*
        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 파일의 이름을 수정한 뒤 코어에서 주소를 찾아보면

 

 

여기 있고

 

 

이렇게 풀린다. 

'pwnable > LOB' 카테고리의 다른 글

LOB 12번  (0) 2020.08.01
LOB 11번  (0) 2020.07.26
LOB 9번  (0) 2020.07.25
LOB 8번  (0) 2020.07.25
LOB 7번  (0) 2020.07.25

+ Recent posts