Problemas al construir una cadena ROP

8

Estoy tratando de explotar un pequeño programa. El programa tiene este aspecto:

int func(void) {
    char text[100];
    scanf("%s", text);
    return 0;
}


int foo(unsigned short rand) {
    char RandomBuffer[rand];
    return func();
}


int main(int argc, char* args[]) {
srand(time(NULL));
    return foo(rand() % 1000);
}

Utilicé ROPgadget para crear una cadena de ROP. La herramienta encuentra un gadet que es necesario para el ataque:

 Gadget found: 0x8058fcc pop edx ; ret

Mi cadena de ROP comienza así:

p = ‘rnd padding’
p += pack('<I', 0x08058fcc) # pop edx ; ret

Sin embargo, cuando ejecuto mi exploit obtengo:

Stopped reason: SIGILL
0x08058fcc in _int_memalign ()

El EIP apunta a la dirección calculada por ROPgadget pero de alguna manera no es el comando correcto.

EIP: 0x8058fcc (<_int_memalign+108>:    lock mov eax,esi)

¿Qué me estoy perdiendo?

Saludos

    
pregunta alive-and-well 04.07.2017 - 13:24
fuente

2 respuestas

1

Sin más análisis, es difícil determinar la causa exacta de esto. Un problema común es que la ejecución de la aplicación en un depurador cambia ligeramente el diseño de la memoria y puede ser suficiente para romper el exploit con / sin un depurador adjunto. ¿Ha intentado ejecutarlo sin un depurador adjunto y luego analizar el volcado de memoria?

Sin embargo, pop edx;ret no debería ser demasiado difícil de encontrar, ya sea en otra dirección o mediante un gadget un poco más largo, como pop edx; pop eax; ret . Reunir una cadena ROP es un rompecabezas y hay más de una forma de hacerlo.

    
respondido por el wireghoul 13.07.2017 - 04:42
fuente
1

Es probable que falte PIE / ASLR, lo que hace que el cargador coloque su ejecutable en una dirección diferente cada vez que se ejecute, lo que a su vez significa que su gadget estará en una dirección diferente cada vez. Mire en su compilador si hay una manera de desactivarlo. Muchas construcciones de gcc usan -no-pie por ejemplo. De lo contrario, es posible que pueda deshabilitar ASLR para todo el entorno. Esto es diferente en diferentes versiones de Linux, pero la forma más común (creo) es

sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
    
respondido por el Tobias 15.08.2017 - 09:02
fuente

Lea otras preguntas en las etiquetas