Advanced ROP Attacks
Juan Sacco ( runlvl )
@exploitpack [Link]
Resumen
Introduccion a los ataques ROP ROP variantes
Exploits ROP Alphanumericos
Buscando vectores Preguntas?
Ataques ROP
Introduccion de Juan Sacco Proteccion DEP (data execution prevention) Exploits basados en memoria Tecnicas ret-2-lib ( Todos sus tipos) Aplicable a varias arquitecturas
ROP Attacks
Los vectores son construidos Los vectores finalizan con un RET Ejemplo de vectores
Mov eax, ebx Ret Pop eax Ret
ROP attacks
x86 stack layout . Registro de ebp y esp apunta a la base y top respectivamente . EBP se usa para acceder local y se pasan parametros por ejemplo:. [ebp + 8] primer parametro (EBP + 4) para la direccion ret . ESP se usa como puntero para popear valores del stack
ROP attacks
RET x86 instruction
Pops un valor del stack hacia el EIP
Usado para retornar el control a una function RET puede tener argumentos ejemplo RET 8
RET 8 == EIP = stack[top], add ESP , 8
X86 stack layout
Ejemplo de una llamada ( CALL )
Int __stdcall function(int a, int b) // < paramerts { int b,c; // local c variables return 0; } function(10, 20); // function call __stdcall
X86 disassembly push 20 // arguments pushed from right to left push 10 call function function: push ebp mov ebp, esp sub esp, 8 . . add esp, 8 pop ebp ret 8 callie // Stack epilouge //8 bytes for two variabeles
__stdcall ( varadic arguments)
// ret 8 stack clearance by
Basico de un stack overflow
Una variable local en el stack es overflodeada La instruccin CALL empuja el EIP al stack Buscamos una funcion trampolin ejemplo jmp esp para cambiar el valor de eip a un buffer controlado
Que pasa con el NX bit?
DEP restringe la ejecucion de segmentos marcados como r/w Podemos reutilizar codigo desde el address space del ejecutable Utilizamos los chunks que nos sirven como vectores ROP Se pueden encadenar multiples vectores y hasta llamar a una API
ROP Basico ( Carga y Store de vectores)
Leyendo y cargando valores desde y hacia la memoria Ejemplo primitivo: pop eax; ret / pop ebx ret/ pop r32, ret Hacia el stop de memoria: pop eax, pop edx, ret / mov [eax],
edx; ret
Manejando NULLs!
Handling NULL bytes
Algunos parametros contienen NULL Algunas direcciones contienen zero ( valores ) No podemos injectar NULL o Zeros Funciones bugeadas como strcpy terminan de copiar cuando encuentran NULL byte (00 hex)
Handling NULL bytes
x = value contiene uno o muchos NULL bytes y = mask = 0xffffffff Axioma matematico A xor B = z (Por ejemplo) Ahora z xor B = A Podemos usar 0x00000000 xor 0xffffffff = z Xor para volver al valor principal Podemos usar xor esi, ebx ; ret!
ROP basico (Libs maths)
[Link] 0x77c4d6f add ebx, esi; stc; ret [Link] 0x7c902af5 sub eax,ecx; ret
Y asi tenemos mul y div!
Intenten immunity search o en olly: add r32, r32;any;ret;
ROP Shell-codes Alphaumericas
ROP Shellcodes
Shellcodes tradicionales pueden ser alphanumericas seleccionando ciertas instrucciones: Ejemplo. pop ecx has an opcode 0x59 que es el ASCII code del caracter Y)
Tecnica similar utilizada en ROP
. Seleccionando una direccion que sea printable envez de un opcode ( caso de sllecodes tradicionales )
ROP Shellcodes
Tecnicas basicas agregando dos direciones imprimibles, el tango de ASCII en los caracteres entre 0x21 y 0x7e Ejemplo, un vector en [Link] en 0x77D4B8C { pop ebx;ret} puede ser representada por dos direcciones:
0X225D414B(printable) + 0x55777777(printable) = 0x77D4B8C2(no-printable)
Comibadas pueden ser utilizadas para transformar codigo printable en uno que no lo es.
Tecnica similar se utiliza en ROP shellcodes
Alphanumeric ROP Shellcodes
Los vectores son utilizados para las direcciones que hacen decoding, los bytes deben ir en el rango 0x21 y 0x7e
Tambien necesitamos regiones de memoria que sean printables para poder guardar los vectores marcados como r/w
Para las regiones de memoria tenemos por ejemplo: [Link] 0x772C2E5E . MOV DWORD PTR DS:[ECX],EAX POP EAX . ESP relacionado a [Link] 0x775513E30 XCHG EAX,ESP [Link] 0x74722973
. [Link]
0x7D504962
ADD EAX,ECX
. [Link] MEM hacia reg 0x74714263 MOV EAX,DWORD PTR DS:[ECX] . Todas estas librerias son cargadas en memoria por internet explorer
Gracias!
Juan Sacco jsacco@[Link]