Dirección dañada al realizar una cadena ROP de 64 bits

3

Estoy tratando de aprender el encadenamiento ROP en una máquina Linux de 64 bits y me he encontrado con algunos problemas. Estoy usando el siguiente código para el desbordamiento del búfer (tomado de este tutorial ):

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

char *not_used = "/bin/sh";

void not_called() {
    printf("Not quite a shell...\n");
    system("/bin/date");
}

void vulnerable_function(char* string) {
    char buffer[100];
    strcpy(buffer, string);
}

int main(int argc, char **argv) {
    vulnerable_function(argv[1]);
    return 0;
}

El problema que estoy encontrando es que la dirección del gadget ROP (de libc) es 0x7EFBF7B267DB, que es la dirección de un pop% rax; pop% rdi; llamada% rax ;. Sin embargo, si mi carga útil es, por ejemplo: \ x41 \ x41 \ x41 ..... \ x41 \ x41 \ xdb \ x67 \ xb2 \ xf7 \ xfb \ x7e \ x41 \ x41 \ x41 \ x41 \ x41 \ x41, entonces intenta llamar a 0x41417EFBF7B267DB en lugar de 0x7EFBF7B267DB. No conozco ninguna manera de evitar esto. ¿Alguna sugerencia?

    
pregunta William Moffitt 27.11.2016 - 21:41
fuente

1 respuesta

3

Una dirección de 64 bits significa que cada dirección tendrá una longitud de 8 bytes. La dirección a la que desea apuntar es 0x00007EFBF7B267DB en lugar de 0x7EFBF7B267DB.
Cambie su entrada a \ x41 \ x41 \ x41 ..... \ x41 \ x41 \ xdb \ x67 \ xb2 \ xf7 \ xfb \ x7e \ x00 \ x00 \ x41 \ x41 \ x41 \ x41 y tu código debería funcionar bien.

EDIT después de seguir analizando el problema en los comentarios:
Este enlace de Reverse engineering SE muestra que ROP para una máquina de 64 bits puede ser complicado, especialmente si tiene bytes nulos en la dirección y el código de explotación tiene strcpy.
El enlace sugiere usar una serie de errores y crear una cadena para solucionar el problema o si solo desea usar un código de shell, escriba un arnés sugerido en su código de shell.

    
respondido por el Limit 27.11.2016 - 22:27
fuente

Lea otras preguntas en las etiquetas