Académique Documents
Professionnel Documents
Culture Documents
Introduccin al Shellcode
jcano@uniandes.edu.co
1
JCM-05 All rights reserved.
Agenda
Introduccin
Conceptos Bsicos
Administracin de memoria
System Call
String format
Stack Overflows
Heap Overflows
Shellcode
Conceptos bsicos
Esqueleto de un cdigo shell
Ejemplos de Shellcodes
Ejemplo en Sistemas Windows
Ejemplo en Sistemas Linux
Heap
Dynamic variables
Segmento de donde es posible la Escritura
BSS Block Started by Symbol Reservado para variables
Uninitialized Data Globales
Data Segmento de donde es posible la Escritura
Initialized Data
Libreras Compartidas
0x8000000 Low Address
JCM-05 All rights reserved. 5
Conceptos Bsicos
Registros
0xBFFFFFFF High Address
Env pointer
argc
Function ()
Stack In compiled code
Local variables,
function calls
EIP
Function () Text
Local variables Compiled program code
EBP
ESP
Data
Initialized Data
Libreras Compartidas
0x8000000 Low Address
JCM-05 All rights reserved. 6
Conceptos Bsicos
System Call
Es un conjunto de funciones que permiten a un tercero
acceso a funciones especficas del sistema operacional
como:
Obtener entradas
Producir salidas
Terminar procesos
Ejecutar binarios
Especificaciones de formato:
%d presentado como nmero entero Como valor
%u presentado como nmero natural Como valor
%x presentado como nmero natural hexadecimal Como valor
%s presentado como cadena alfanumrica Como referencia
%n Nmero de caracteres impresos hasta el momento Como
referencia.
Stack
Variables locales de la funcin
Que nos ha invocado
Puntero a la variable a
Argumentos de la funcin
Int main() { Printf()
Puntero a la cadena de formato
char *a = Hola Mundo;
Printf(Mensaje a presentar: %s \n, a); Direccin de retorno de la funcin
printf
}
Heap
Dynamic variables
Libreras Compartidas
0x8000000 Low Address
JCM-05 All rights reserved. 9
Conceptos Bsicos
String Format - 3
Utilizando especificaciones de formato
prog1
Int main(int argc, char **argv) {
1 $ ./prog1 %x-%x-%x'
char f[256]; Bffffc4f-0-0
Strcpy (f, argv[1]); -------------------------------------------------
Printf(f); 2 $ ./prog1 ' %n %n %n %n '
}
Segmentation fault
1. Se le pasa como parmetro al programa, una instruccin en comillas inversas, lo que sugiere la ejecucin del programa
y lo que se encuentra entre comillas, tomando una palabra de 4 bytes de la pila (pues no haba argumento), y as sucesivamente
2. El programa ha tratado de escribir a una direccin de memoria al azar la cantidad de caracteres impresos.
Tomado de: SOBOLEWSKI, P. y NIDECKI, T. (2004) Abusos de las cadenas de formato. Hakin9. No.5. Noviembre/Diciembre.
JCM-05 All rights reserved. 10
Stack Overflows
Caractersticas bsicas
Generalmente se dan por manipulacin o mal uso de
buffers
Un buffer es un conjunto contiguo de espacio de memoria.
Stack
Void return_input (int a, int b) { Variables locales de la funcin
Direccin Que nos ha invocado
char array [30]; inexistente o
gets (array); protegida! b
printf ( %s \n, array) a
0x41414141 AAAA RET
}
0x41414141 AAAA EBP
AAAAAAAAAAAA
main( ) { Argumentos de la funcin AAAAAAAAAAAA
Array
Printf() AAAAAAAAAAAA
return_input (1,2 );
return 0;
}
Heap
Dynamic variables
Libreras Compartidas
0x8000000 Low Address
JCM-05 All rights reserved. 12
Heap Overflows
Caractersticas bsicas
La zona de heap, es aquel lugar de memoria para manejo de
variables que permanecen por largo tiempo, las cuales
continuan existiendo an la funcin haya retornado (y sus
variables hayan sido elimadas del stack)
Funciones que manejan este segmento malloc () y free (),
los cuales se apoyan en brk() o mmap() (esta dos ltimas
system call).
Consideraciones de funcionamiento
Cuando se usa malloc(), brk() asigna un bloque amplio de
memoria en pedazos, el cual entrega al usuario segn su
solicitud.
Cuando se usa free(), decide sobre el nuevo pedazo de
memoria liberado, para armar un bloque mas grande
disponible.
1. Existen dos buffers contiguos defindos. El primero sobrepasa su tamao y afecta al segundo. Particularmente sobre
escribe la estructura de metadatos del segundo. Luego cuando se intenta liberar el segundo buffer posiblemente se esta
teniendo acceso a un segmento de memoria invlido.
KOZIOL, J., AITEL, D., LITCHFIELD, D., ANLEY, C., EREN, S., MEHTA, N. y HASSELL, R. (2004)
The shellcoders handbook: discovering and exploiting security holes. John Wiley & Sons
JCM-05 All rights reserved. 14
Shellcodes
Caractersticas bsicas
Una pieza de cdigo de mquina ejecutable o cdigo script
que tiene una sola misin: abrir un intrprete de comandos
en el sistema objetivo.
Generalmente se crean en cdigo ensamblador
Consideraciones de funcionamiento
Los shellcodes son generalmente utilizados para explotar
vulnerabilidades, basado en una tcnica de vulneracin
como son :
Stack buffer overflows
Heap buffer overflows
Formar string
Integer overflow
Memory corruption, etc.
Utilizan el contenido de la memoria (Payload)
Decodificar
Generalmente encontramos en memoria caracteres NULL, los cuales nos
impiden ejecutar nuestro cdigo. Lo que implica que debamos codificar
nuestro cdigo generalmente con XOR con un valor predifinido
Shellcode
Direccin del
Shellcode
Direccin del
Direccin de retorno
Direccin anterior de
EIP
Shellcode
Shellcode
NOP
Buf[ ]
Live Analysis
Implica la misma conversin del cdigo de mquina a cdigo
humanamente reconocible, pero el anlisis se hace en ejecucin misma
del sistema. Puedes observar los datos internos del programa y cmo
afecta el cdigo.
Compartidos: Extensin .so, los cuales contienen el cdigo y los datos que
participan en el proceso de encadenamiento de los objetos en los dos
contextos.
Tomado de: EILAM, E. (2005) Reversing. Secrets of reverse engineering. John Wiley & Sons. Cap.10
JCM-05 All rights reserved. 24
Reflexiones Finales
jcano@uniandes.edu.co
29
JCM-05 All rights reserved.