====== Exploiting ====== ==== Stack Overflow ==== Desbordar el stack y sobrescribir la dirección de retorno con la dirección del shellcode (direct RET overflow) ==== DEP (Data Execution Prevention) ==== Las páginas de memoria no pueden ser w y x a la vez. En los navegadores y los JIT en general, hay páginas que son w y x a la vez y no tienen DEP. Las funciones ZwProtectVirtualMemory y NtSetInformationProcess permiten desactivar el DEP, pero hay que controlar los registros y hacer un ret2lib ==== Return2libc ==== Sobrescribir la dirección de retorno con una llamada a una función de libc para crear una shell. En x64 no vale porque los primeros 4 argumentos se pasan en rcx, rdx, r8 y r9 ==== Borrowed code chunks ==== Se basa en coger trozos de codigos del programa que cuando se junten, creen una shell. Los trozos de código deben de estar cerca de un ret, jmp [esp], jmp [ebp] para que se controle la dirección a la que se salta ==== ALSR (Address Layout Space Randomization) ==== Randomiza las direcciones cada vez que se abre un programa, pero sólo varia la parte alta de la dirección. Si hay un registro, variable en el stack, etc. que tiene una dirección, sólo hay que sobrescribir la parte baja. Si no, ya hay que encontrar un módulo que no tenga ASLR ==== SEH (Structured Exception Handler) ==== Los SEH son listas simples de la forma: ________________________________ | Puntero al | Puntero al EH | | siguiente SEH | | |_______________|_______________| 4 bytes 4 bytes Si el puntero vale -1, es el final de la lista Para saltarlo: - Causar una excepción - Sobrescribir el puntero al siguiente SEH para que apunte al shellcode - Sobrescribir el puntero al EH con una dirección que tenga pop, pop, ret - Al hacer ret se salta al shellcode ya que se retira el puntero al siguiente SEH ==== Stack Cookies ==== Es un valor de 4 bytes calculado con parámetros del sistema y el proceso, que está en el stack.El epílogo de las funciones comprueba si se sobrescribe, y en caso afirmativo, lanza una excepción. Para saltarlo: * Conseguir/adivinar/predecir la cookie (si es fácil) * Sobrescribir el SEH y lanzar una excepción antes de que se compruebe la cookie * Sobrescribir la cookie en .data: hace falta un 4 byte arbitrary write ==== Safe SEH ==== Comprueba que * El EH no pertence al stack * El EH pertenece a los módulos cargados * El SEH concuerda con un SEH redundante Para saltarlo: * Usar direcciones fuera del rango de los módulos cargados * Usar un módulo sin SEH * Poner el shellcode en el heap