Está en la página 1de 18

Advanced ROP Attacks

Juan Sacco ( runlvl )


@exploitpack http://exploitpack.com

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)


Msvcrt32.dll 0x77c4d6f add ebx, esi; stc; ret Kernel32.dll 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 kernel32.dll 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: urlmon.dll 0x772C2E5E . MOV DWORD PTR DS:[ECX],EAX POP EAX . ESP relacionado a CRYPTUI.dll 0x775513E30 XCHG EAX,ESP MSCTF.DLL 0x74722973

. Mshtml.dll

0x7D504962

ADD EAX,ECX

. msimtf.dll MEM hacia reg 0x74714263 MOV EAX,DWORD PTR DS:[ECX] . Todas estas librerias son cargadas en memoria por internet explorer

Gracias!
Juan Sacco jsacco@exploitpack.com

También podría gustarte