como penetrar un sistema por medio de desbordamiento de buffer€¦ · desbordamiento de buffer....
TRANSCRIPT
COMO PENETRAR UN SISTEMA POR MEDIO DE DESBORDAMIENTO DE BUFFER
OBJETIVO
Entender los aspectos técnicos, por los cuales un intruso puede ingresar a un sistema y tomar el control
de éste
AGENDA
● Programas● Memoria● Pila● Funciones● Etapas de invocación● Arreglos y buffers● Desbordamiento de buffer● Impacto● Tecnicas de protección
PROGRAMAS
● Lenguaje de alto nivel– Compilador
● Lenguaje ensamblador – Ensamblador
●Mnemonics●Opcode
● Lenguaje de máquina
ORGANIZACIÓN DE UN PROCESO EN MEMORIA
● Segmento de texto (r-x)– Código
● Segmento de datos (rw-)– Variables globales– Variables estáticas
● Segmento de pila (rwx)
AREAS DEL SEGMENTO DE PILA
● Heap– Memoria dinámica
● Pila– Direcciones de retorno– Variables locales– Parámetros
● Argumentos● Ambiente
EJEMPLOint global; // Segmento de datos
int
sumar (int i, int j)
{
return i + j;
}
int
main ()
{
int resultado = sumar (1, 2); // Segmento de pila
}
MEMORIA
LA PILA COMO TAD
● LIFO: Last In First Out● Ultimo objeto ubicado en ella es el
primero en salir● Operaciones:
– PUSH: Añade un elemento al tope de la pila
– POP: Retira el elemento del tope de la pila
TALLER 1
● PUSH 1● PUSH 2● POP● PUSH 2● PUSH 1● POP● POP● PUSH 4● PUSH 1
TALLER 1
141
SEPARATION OF CONCERNS
● Edsger Dijkstra
● Programación Estructurada
–Funciones, Procedimientos● Programación Orientada a Objetos
– Objetos
● Programación Orientada a Aspectos– Aspecto
FUNCIONESint global;
int sumar (int i, int j)
{
return i + j;
}
int main ()
{
int resultado = sumar (1, 2);
resultado = sumar (3, 4);
}
LOCALIZACIÓN DE FUNCIONES
SEGMENTO DE TEXTO987 función SUMAR6543 función MAIN21
1 2 3 4 5 6 7 8
DURACIÓN DE VARIABLES
SEGMENTO DE DATOS98 global
76 resultado
543 i j
21
1 2 3 4 5 6 7 8
INVOCACIÓN DE FUNCIONES
● ¿Que problemas hay con las funciones?– Devolver el control a la función invocadora– Si las variables locales estuvieran en el
segmento de datos:● ¿Que pasaria con esa memoria si la funcion no se
invoca?● ¿Que pasaria con la recursividad de funciones?● ¿Que pasaria con los hilos?
INVOCACIÓN DE FUNCIONES
● Soluciones– Las variables locales solo deben existir
mientras la función este en ejecución– Por cada invocación a la función, deben
exisitir diferentes copias de sus variables locales
– Siempre que se invoque la función se debe almacenar la dirección a la cual se debe retornar una vez termine la función
INVOCACIÓN DE FUNCIONES
● Cada que se invoque una función se reservará un espacio en la pila para que en ella se almacene todo lo que se necesita– Parametros– Variables locales– Valor de retorno– Dirección de retorno
INVOCACIÓN DE FUNCIONES
AREA DE PILA
1VALOR DE RETORNO
SU
MA
R
2VARIABLES LOCALES3DIRECCIÓN DE RETORNO4VALOR DE RETORNO
MA
IN
5VARIABLES LOCALES6DIRECCIÓN DE RETORNO
ETAPAS DE INVOCACIÓN
● Etapa 1 - Invocación(a) Almacenamiento de parámetros
(b) Almacenamiento de dirección de retorno
(c) Cambio del PC a la dirección de la función
● Etapa 2 - Prólogo(d) Almacenamiento de dirección de frame anterior
(e) Separar espacio para almacenar variables locales
● Etapa 3 - Epílogo(f) Disponibilidad de variables locales anteriores
(g) Retornar el control a la función anterior
EJEMPLO
void funcion (int a, int b, int c){ char buffer1[5]; char buffer2[10];}
int main (){ funcion(1,2,3);}
EJEMPLO – TALLER 2
(gdb) disas main
Dump of assembler code for function main:
0x8048388 <main>: push %ebp
0x8048389 <main+1>: mov %esp,%ebp
0x804838b <main+3>: push $0x3
0x804838d <main+5>: push $0x2 (a)0x804838f <main+7>: push $0x1
0x8048391 <main+9>: call 0x8048380 <funcion> (b) y (c)0x8048396 <main+14>: add $0xc,%esp
0x8048399 <main+17>: leave
0x804839a <main+18>: ret
0x804839b <main+19>: nop
End of assembler dump.
RESULTADOAREA DE PILA
159131721
SP -> 25 08 04 83 9629 00 00 00 01
MA
IN33 00 00 00 0237 00 00 00 03
BP -> 41 ? ? ? ?
EJEMPLO – TALLER 2
(gdb) disas funcion
Dump of assembler code for function funcion:
0x8048380 <funcion>: push %ebp (d)0x8048381 <funcion+1>: mov %esp,%ebp (e)0x8048383 <funcion+3>: sub $0x14,%esp (e)0x8048386 <funcion+6>: leave
0x8048387 <funcion+7>: ret
End of assembler dump.
RESULTADOAREA DE PILA
SP -> 1
FU
NC
ION
591317
BP -> 21 00 00 00 41
MA
IN
BP25 08 04 83 96 DR29 00 00 00 01 PAR133 00 00 00 02 PAR237 00 00 00 03 PAR341 ? ? ? ?
EJEMPLO – TALLER 3(gdb) disas funcion
Dump of assembler code for function funcion:
0x8048380 <funcion>: push %ebp
0x8048381 <funcion+1>: mov %esp,%ebp
0x8048383 <funcion+3>: sub $0x14,%esp
0x8048386 <funcion+6>: leave (f)0x8048387 <funcion+7>: ret
End of assembler dump.
● Leave– Igualar el SP al BP– Hacer POP y poner ese valor en el BP
RESULTADOAREA DE PILA
1
FU
NC
ION
59131721 00 00 00 41
MA
IN
BPSP -> 25 08 04 83 96 DR
29 00 00 00 01 PAR133 00 00 00 02 PAR237 00 00 00 03 PAR3
BP -> 41 ? ? ? ?
EJEMPLO – TALLER 4(gdb) disas funcion
Dump of assembler code for function funcion:
0x8048380 <funcion>: push %ebp
0x8048381 <funcion+1>: mov %esp,%ebp
0x8048383 <funcion+3>: sub $0x14,%esp
0x8048386 <funcion+6>: leave
0x8048387 <funcion+7>: ret (g)End of assembler dump.
● Ret– Hacer POP y poner ese valor en el PC
RESULTADOAREA DE PILA
1
FU
NC
ION
59131721 00 00 00 41
MA
IN
BP25 08 04 83 96 DR
SP -> 29 00 00 00 01 PAR133 00 00 00 02 PAR237 00 00 00 03 PAR3
BP -> 41 ? ? ? ?
¿QUE SE ALMACENA EN LA PILA?
● Parametros● Dirección de retorno● Dirección de las variables anteriores● Variables locales
ARREGLOS● Agrupación● Consecutiva● Mismo tipo
● Recorrido por medio de– Apuntadores– ¿Referencias?
● ¿Verificación de limites?
DESBORDAMIENTO DE BUFFER
● Sobrepasar el limite● Escritura en posiciones adyacentes al buffer, es decir, fuera de los limites
TALLER FINAL
● Que pasaría si el buffer que trataramos de escribir en el primer ejemplo fuera el siguiente:
–01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-00-00-00-01
RESULTADOAREA DE PILA
SP -> 1 01 02 03 04
FU
NC
ION
5 05 06 07 089 09 10 11 1213 13 14 15 1617 17 18 19 20
BP -> 21 21 22 23 24
MA
IN
BP25 00 00 00 01 DR29 00 00 00 01 PAR133 00 00 00 02 PAR237 00 00 00 03 PAR341 ? ? ? ?
PREGUNTAS
¿Que se sobreescribiría?
RESPUESTA
LA DIRECCIÓN DE RETORNO
¿y esto que significa?
RESPUESTA
Desbordando un buffer puedo cambiar el flujo de
ejecución de un programa
¿pero a dónde?
RESPUESTA
A instrucciones maliciosas que se encuentran en el
mismo buffer¿y cuál es el impacto?
RESPUESTA
Se pueden ejecutar instrucciones arbitrarias
dentro de un proceso
TECNICAS DE PROTECCIÓN
● Segmentos de pila no ejecutables● Verificación de limites
Nombre: Juan Rafael Alvarez Correa
Email: [email protected]
Web: http://people.fluidsignal.com/~jalvarez
Telefono celular: 3006551750
Telefono oficina: 574-3522627