아래는 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

+ Recent posts