¿Puedo hacer un exploit de formato de cadena para sistemas x64? [cerrado]

4

Estaba intentando replicar el experimento en Gray Hat Hacking - Third Edition , Capítulo 12, sobre las explotaciones de cadenas de formato, pero su arquitectura es IA32, mientras que la mía es de 64 bits de AMD. Por lo tanto, cuando compruebo valores en la pila con comandos como:

$ ./fmtstr "AAAAAAAA %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x"   

No aparece nada que se parezca a su representación en la memoria (41414141 41414141). ¿Por qué el búfer de explotación no devuelve datos de memoria reales y secuenciales? Para obtener más información, consulte la la imagen de su consola .

    
pregunta Fernando Pérez 07.04.2017 - 17:20
fuente

1 respuesta

5

Si está utilizando el código de ejemplo del libro (a continuación), en algún momento debe alcanzar el patrón "AAAAAAAA" (0x41). Tenga en cuenta que, dado que lo está ejecutando en una máquina de 64 bits que almacena elementos en la pila con 8 bytes cada uno, debe ejecutarlo con $ ./fmtstr "AAAAAAAA %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x" en su lugar, o perderá parte de cada elemento en la pila.

#include <stdlib.h>
int main(int argc, char *argv[]){
        static int canary=0;   // stores the canary value in .data section
        char temp[2048];       // string to hold large temp string
      strcpy(temp, argv[1]);   // take argv1 input and jam into temp
      printf(temp);            // print value of temp
      printf("\n");            // print carriage return
      printf("Canary at 0x%08x = 0x%08x\n", &canary, canary); //print canary
}

Debes prestar atención a la cita en el libro que dice:

  

El hecho de que el cuarto elemento mostrado (de la pila) fuera nuestra cadena de formato depende de la naturaleza de la función de formato utilizada y la ubicación de la llamada vulnerable en el programa vulnerable. Para encontrar este valor, simplemente use la fuerza bruta y siga aumentando el número de tokens% 08x hasta que se encuentre el comienzo de la cadena de formato. Para nuestro ejemplo simple (fmtstr), la distancia, llamada desplazamiento, se define como 4.

Recuerde que el parámetro que se está analizando a printf no es la cadena en sí, sino la dirección de la cadena. Entonces, la posición en el diseño de memoria del programa en relación con el printf stack es lo que definirá qué tan lejos tendrá que buscar para encontrarlo.

    
respondido por el murphsghost 07.04.2017 - 20:00
fuente

Lea otras preguntas en las etiquetas