El Derecho Del Trabajador a La Indemnización Por Despido Arbitrario
EJECUCIÓN DE CÓDIGO ARBITRARIO MEDIANTE CADENAS DE FORMATO · ORDEN DEL DÍA Fundamentos –...
Transcript of EJECUCIÓN DE CÓDIGO ARBITRARIO MEDIANTE CADENAS DE FORMATO · ORDEN DEL DÍA Fundamentos –...
EJECUCIÓN DE CÓDIGOARBITRARIO MEDIANTECADENAS DE FORMATO
OBJETIVOS
● Entender los aspectos técnicos, por los cuales un intruso puede ingresar a un sistema y tomar el control de éste.
● Conocer algunas formas de ataque utilizadas por los intrusos para explotar una vulnerabilidad.
ORDEN DEL DÍA
● Fundamentos– Programas - Procesos– Pila – Funciones -Invocación– Cadenas de formato
● Inyección de cadenas de formato– Para leer memoria arbitrarias– Para escribir en memoria arbitraria– Para ejecutar código arbitrario
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 estáticas
● Segmento de pila (rwx)– Variables locales automáticas
ÁREAS 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– Asignar memoria a las variables locales– Asignar memoria a los parámetros
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
existir 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– Parámetros– Variables locales– Valor de retorno– Dirección de retorno
INVOCACIÓN DE FUNCIONESESP 00 00 00 42
EBP 00 00 00 66
EIP ?? ?? ?? ??
343842 ?? ?? ?? ?? Variable local46 ?? ?? ?? ?? Variable local50 ?? ?? ?? ?? Variable local54 ?? ?? ?? ?? Variable local58 ?? ?? ?? ?? Variable local62 ?? ?? ?? ?? Variable local66 86 00 00 0070 10 10 00 0074 ?? ?? ?? ?? Parametro78 ?? ?? ?? ?? Parametro82 ?? ?? ?? ?? Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Apuntador de marco de la función invocadoraDirección de retorno a la función invocadora
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
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 EN C
void funcion (int a, int b, int c){ char buffer1[5]; char buffer2[10];}
int main (){ funcion(1,2,3);}
EJEMPLO EN ASM
(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.
ANTES DE (a)ESP 82 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
34384246505458626670747882 ?? ?? ?? ?? Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
DESPUES DE (a)ESP 70 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
34384246505458626670 01 00 00 00 Parametro74 02 00 00 00 Parametro78 03 00 00 00 Parametro82 ?? ?? ?? ?? Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
DESPUES DE (b) y (c)ESP 66 00 00 00
EBP 86 00 00 00
EIP 80 83 04 08
343842465054586266 96 83 04 0870 01 00 00 00 Parametro74 02 00 00 00 Parametro78 03 00 00 00 Parametro82 ?? ?? ?? ?? Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Dirección de retorno a la función invocadora
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
EJEMPLO EN ASM (AT&T)
(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.
DESPUES DE (d)ESP 62 00 00 00
EBP 86 00 00 00
EIP 80 83 04 08
3438424650545862 86 00 00 0066 96 83 04 0870 01 00 00 00 Parametro74 02 00 00 00 Parametro78 03 00 00 00 Parametro82 ?? ?? ?? ?? Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadoraDirección de retorno a la función invocadora
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
DESPUES DE (e)ESP 42 00 00 00
EBP 62 00 00 00
EIP 80 83 04 08
343842 ?? ?? ?? ?? Variable local buffer2[12]46 ?? ?? ?? ??50 ?? ?? ?? ??54 ?? ?? ?? ?? Variable local buffer1[5]58 ?? ?? ?? ??62 86 00 00 0066 96 83 04 0870 01 00 00 00 Parametro74 02 00 00 00 Parametro78 03 00 00 00 Parametro82 ?? ?? ?? ?? Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadoraDirección de retorno a la función invocadora
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
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– movl %ebp,%esp– popl %ebp
DESPUES DE (f)ESP 66 00 00 00
EBP 86 00 00 00
EIP 80 83 04 08
343842 ?? ?? ?? ?? Variable local buffer2[12]46 ?? ?? ?? ??50 ?? ?? ?? ??54 ?? ?? ?? ?? Variable local buffer1[5]58 ?? ?? ?? ??62 86 00 00 0066 96 83 04 0870 01 00 00 00 Parametro74 02 00 00 00 Parametro78 03 00 00 00 Parametro82 ?? ?? ?? ?? Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadoraDirección de retorno a la función invocadora
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
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
DESPUES DE (g)ESP 70 00 00 00
EBP 86 00 00 00
EIP 96 83 04 08
343842 ?? ?? ?? ?? Variable local buffer2[12]46 ?? ?? ?? ??50 ?? ?? ?? ??54 ?? ?? ?? ?? Variable local buffer1[5]58 ?? ?? ?? ??62 86 00 00 0066 96 83 04 0870 01 00 00 00 Parametro74 02 00 00 00 Parametro78 03 00 00 00 Parametro82 ?? ?? ?? ?? Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadoraDirección de retorno a la función invocadora
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
¿QUE SE ALMACENA EN LA PILA?
● Parámetros● Dirección de retorno● Dirección de las variables anteriores● Variables locales
LENGUAJES
Mecanismos estandarizados de comunicación con el computador● Objetivos
– Manipulación de datos– Presentación de información– Definir lenguajes– Ejecutar sentencias de comandos– Especificar el formato de un texto
CADENAS DE FORMATO
● “Millos es %d veces campeon\n”● “Millos es %s a Nacional\n”
CADENAS DE FORMATO
printf (“%s %d %s\n”..
Parámetros de formatoCOMO TRATAR LOS DEMÁS
PARÁMETROS
CONTENIDO SINTÁCTICO
Las expresiones tienen:– Contenido constante
● Definidas por el programador● Definidas por el usuario
– Contenido sintáctico● Definido por el programador● Definido por el usuario
● “Millos es %d veces campeon\n”
LEER POSICIONES ARBITRARIAS DE MEMORIA
USO PREVISTO DE PRINTF(A)
int x = 13;printf (“%d\n”, x);
(B)char* y = “Millos campeon”;printf (“%s”, y);
(D)printf (y);
(C)printf (“%s %d veces\n”, y, x);
PILA EN (A)ESP 58 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
34384246505458 70 00 00 00 Parametro 1: Apuntador a la definición de la cadena de formato62 13 00 00 00 Parametro 2: Entero que se debe imprimir66 ?? ?? ?? ?? Variable local70 % d \ n Variable local: Definición de la cadena de formato74 ?? ?? ?? ?? Variable local78 ?? ?? ?? ?? Variable local82 ?? ?? ?? ?? Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
PILA EN (B)ESP 58 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
34384246505458 70 00 00 00 Parametro 1: Apuntador a la definición de la cadena de formato62 78 00 00 00 Parametro 2: Cadena que se debe imprimir66 ?? ?? ?? ?? Variable local70 % s \ n Variable local: Definición de la cadena de formato74 ?? ?? ?? ?? Variable local78 M i l l Variable local82 o s . . Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
PILA EN (C)ESP 54 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
343842465054 70 00 00 00 Parametro 1: Apuntador a la definición de la cadena de formato58 78 00 00 00 Parametro 2: Cadena que se debe imprimir62 13 00 00 00 Parametro 3: Parametro que se debe imprimir66 ?? ?? ?? ?? Variable local70 % s % Variable local: Definición de la cadena de formato74 d v . Variable local78 M i l l Variable local82 o s . . Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
(B)
PILA EN (D)ESP 62 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
3438424650545862 78 00 00 00 Parametro 1: Apuntador a la definición de la cadena de formato66 ?? ?? ?? ?? Variable local70 ?? ?? ?? ?? Variable local74 ?? ?? ?? ?? Variable local78 M i l l Variable local82 o s . . Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
PROGRAMA VULNERABLE
intmain (int argc, char** argv){ if (argc == 2) { printf (argv[1]); printf ("\n"); }}
PILA CON CONTENIDO CONS.ESP 62 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
3438424650545862 78 00 00 00 Parametro 1: Apuntador a la definición de la cadena de formato66 ?? ?? ?? ?? Variable local70 ?? ?? ?? ?? Variable local74 ?? ?? ?? ?? Variable local78 M i l l Variable local82 o s . . Variable local86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
PILA CON CONTENIDO SINTA.ESP 50 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
34384246 66 00 00 00 Parametro 1: Apuntador a la definición de la cadena de formato50 ?? ?? ?? ?? Variable local54 ?? ?? ?? ?? Variable local58 ?? ?? ?? ?? Variable local62 M i l l Variable local: Definición de la cadena de formato66 % 0 8 x70 % 0 8 x74 % 0 8 x78 % 0 8 x82 % 0 8 x86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
SALIDA
$ ./programa "Millos"Millos$ ./programa "%08x"00000066$ ./programa "%08x.%08x.%08x.%08x.%08x"00000066.????????.????????.????????.%08x%08x
Y SI......?
La primera parte de la cadena inyectada contiene una dirección
yEl parametro de formatocorrespondiente es %s
PILA CON CONTENIDO SINTA.ESP 50 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
34384246 66 00 00 00 Parametro 1: Apuntador a la definición de la cadena de formato50 ?? ?? ?? ?? Variable local54 ?? ?? ?? ?? Variable local58 ?? ?? ?? ?? Variable local62 34 00 00 00 Variable local: Definición de la cadena de formato66 % 0 8 x70 % 0 8 x74 % 0 8 x78 % 0 8 x82 % s86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
ESCRIBIR POSICIONES ARBITRARIAS DE MEMORIA
PARÁMETRO DE FORMATO PELIGROSO
%d Leer%s Leer%x Leer%n Escribir
PILA CON CONTENIDO SINTA.ESP 50 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
34 32 00 00 00 Caracteres impresos: 8 + 8 + 8 + 8384246 66 00 00 00 Parametro 1: Apuntador a la definición de la cadena de formato50 ?? ?? ?? ?? Variable local54 ?? ?? ?? ?? Variable local58 ?? ?? ?? ?? Variable local62 34 00 00 00 Variable local: Definición de la cadena de formato66 % 0 8 x70 % 0 8 x74 % 0 8 x78 % 0 8 x82 % n86 ?? ?? ?? ??90 ?? ?? ?? ??
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
PILA CON CONTENIDO SINTA.ESP 50 00 00 00
EBP 86 00 00 00
EIP ?? ?? ?? ??
34384246 66 00 00 00 Parametro 1: Apuntador a la definición de la cadena de formato50 ?? ?? ?? ?? Variable local54 ?? ?? ?? ?? Variable local58 ?? ?? ?? ?? Variable local62 90 00 00 00 Variable local: Definición de la cadena de formato66 % 0 8 x70 % 0 8 x74 % 0 8 x78 % 0 8 x82 % n86 ?? ?? ?? ??90 32 00 00 00
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
EJECUTAR CÓDIGO ARBITRARIO
MISIÓN
Sobreescribir la dirección de retorno con un valor valido, es
decir que apunte a código válido
PROBLEMAS
● Sobreescribir el valor de retorno● Con un valor válido
– El valor que se escribe esta en función de los caracteres procesados.
– Las direcciones de memoria generalmente son del orden de los 4 mil millones. Se necesitan 4 mil millones de caracteres procesados.
SOLUCIÓN
AlineaciónEscribir por bytes no por palabras
PILA CON CONTENIDO SINTA.
22 38 00 00 00 Parametro 1: Apuntador a la cadena de formato26 ?? ?? ?? ?? Variable local30 ?? ?? ?? ?? Variable local34 ?? ?? ?? ?? Variable local38 90 00 00 00 Variable local: Definición de la cadena de formato42 91 00 00 0046 92 00 00 0050 93 00 00 0054 % 0 8 x58 % 0 8 x62 % 0 8 x66 % 0 8 x70 .. .. % n Relleno para alcanzar valor deseado + par. formato74 .. .. % n Relleno para alcanzar valor deseado + par. formato78 .. .. % n Relleno para alcanzar valor deseado + par. formato82 .. .. % n Relleno para alcanzar valor deseado + par. formato86 ?? ?? ?? ??90 X Y Z W
Puntero de marco de funcion invocadora de función invocadoraDirección de retorno a la función invocadora de función invocadora
OTRAS PREGUNTAS
● ¿A donde apunta XYZW?– A código valido
● ¿Donde esta el código valido?– En los rellenos de la cadena de formato– ¿y que pasa con los %n intermedios?– Las instrucciones del relleno se tienen
que brincar
PILA CON CONTENIDO SINTA.
90 91 92 93 94 95 96X ? ? ?
Y ? ? ?Z ? ? ?
W ? ? ?
X Y Z W
CONTROLES
● Cuando se construyan programas y se utilicen funciones como printf o cualquier otra que reciba cadenas de formato, nunca permitir la parametrización de la cadena por el usuario. Es decir, siempre especificar cadena de formato.
● Utilizar herramientas de análisis estático para encontrar estos problemas en código ya existente
Nombre: Juan Rafael Álvarez Correa
Email: [email protected]
Web: http://people.fluidsignal.com/~jalvarez
Teléfono celular: 3006551750
Teléfono oficina: 574-3522627