문제 C 코드다.
이전 문제에서 if문이 한개 추가됐다.

argv[0]의 길이가 77이 아니면 종료하도록 되어있다.

그냥 파일 이름길이가 77이 되도록 하면 간단할것 같은데 권한이 없어서 그렇게 할 수 없다.


그래서 사용한 방법은 심벌릭링크를 이용해 제목을 바꾸는 것이다.


/*
        The Lord of the BOF : The Fellowship of the BOF
        - orge
        - check argv[0]
*/

#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);
}

심벌릭 링크로 파일명의 길이를 75로 해야한다.

그 이유는 파일을 실행할때 ./filename 이렇게 실행하는데 경로를 나타내는 ./도 argv[0]에 포함되기 때문이다.


LOB에서 GDB를 돌릴때는 아래와 같이 풀경로로 argv[0] 값을 주기때문에 gdb용 심벌릭 링크와 쉘을 얻기 위한 심벌릭 링크를 총 두 개 주었다.

gdb용 심벌릭 링크의 이름의 길이는 앞의 경로길이를 뺀 61자를 주었다.


위 if문을 우회하고 이전 문제와 같이 argv[2]에 값을 넣는 방식으로 if문을 우회하고 쉘을 땄다.



'Wargame > lord of bufferoverflow' 카테고리의 다른 글

Lord of bufferoverflow troll  (0) 2017.08.18
Lord of bufferoverflow orge  (0) 2017.08.18
Lord of bufferoverflow wolfman  (0) 2017.08.17
Lord of bufferoverflow orc  (0) 2017.08.17
Lord of bufferoverflow goblin  (0) 2017.08.16

+ Recent posts