pregunta fundamental sobre la reescritura de RIP en la carga de exploits cuando tiene bytes nulos (W64)

0

Utilicé un programa simple para probar y aprender desbordamientos basados en la pila. Este es mi programa:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
    char buffer[256];
    if(argc !=2)
        exit(0);
    printf("%p\n",buffer);
    strcpy(buffer,argv[1]);
    printf("%s\n",buffer);
    return 0x00;
}

y con algunos cálculos descubrí la longitud y el orden de mi carga útil:

  

264 * 'A' + RIP (6bytes) + Shellcode

Conocimiento:

  1. RIP no puede ser más grande que "0x00007fffffffffff"
  2. El valor previsto de RIP es "0x61FD50"
  3. La carga útil no puede contener "0x00"

Entonces, si mi código de shell es algo así como 200 * 'C' y usa la carga inferior para el argumento de la línea de comandos de mi programa, será como:

  

264 * 'A' + "\ x61 \ xFD \ x50" [:: - 1] +200 * 'C'

pero cuando veo el RIP del depurador es igual a "4015db". Sé que esto sucede porque la carga útil tiene 3 bytes para RIP pero RIP necesita 8 bytes para sobrescribirse, por lo que utilizará mis 3 bytes ("\ x61 \ xFD \ x50") más 5 bytes de 'C' y se volvió más grande que "0x00007fffffffffff". ¿Cómo puedo forzar que tome solo 3 bytes algo así como:

  

"\ x00 \ x00 \ x00 \ x00 \ x00 \ x61 \ xFD \ x50" [:: - 1]

en mi carga útil? Estoy usando python para escribir mi carga y subprocess.call ("bof.exe" + payload) para ejecutarlo. La versión es Windows 10 (x64) P.S: Estoy usando MingW64 y este comando para compilar mis códigos c ++:

  

g ++ -Wall -fexceptions -fno-stack-protector bof.cpp -o bof.exe

Gracias en avanzado

    
pregunta Masoumi.Saeed 16.06.2017 - 17:44
fuente

0 respuestas

Lea otras preguntas en las etiquetas