Ataque de retorno a libc con el argumento leído de los registros (EDI / RDI)

2

He leído que para realizar un ataque exitoso de retorno a libc, el atacante debe almacenar la dirección del comando (por ejemplo, /bin/sh ) en la pila exactamente después de la dirección de retorno de la función system ( por ejemplo). De esta manera, la función system() lee esa dirección como su parámetro y ejecuta ese comando. Pero ahora, después de desmontar un programa que llama a system() , noté que no usa la pila para obtener la dirección de esa cadena ( "/bin/sh" ). En su lugar, la dirección se almacena en los registros EDI o RDI. Mientras el atacante no pueda acceder a los registros, ¿cómo es posible realizar dicho ataque?

Aquí hay un ejemplo simple:

int main(int argc,char **argv){
    system("id");
    return 0;
}

Y el desmontado:

push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    $0x4005dc,%edi     #Here the address of string is copied to EDI
callq  0x4003e0 <system@plt>
mov    $0x0,%eax
leaveq 
retq
    
pregunta user2808671 20.03.2015 - 11:16
fuente

1 respuesta

3

Lo que estás viendo es un PLT, que es una forma de realizar importaciones de bibliotecas con límite de tiempo. La "convención de llamada" de los PLT no es estándar, pero la cadena de herramientas usualmente usa el paso de parámetros basados en registros para el rendimiento, por lo que ve a edi como la dirección de la cadena. La llamada irá a un apéndice en la Tabla de compensación global (GOT) que luego llama a la función de biblioteca.

La respuesta es sí , puedes explotar esto con un ret2libc, pero no uno estándar. En su lugar, deberá utilizar una técnica de ret-to-plt, que se describe en este documento ( PDF). El punto es que utiliza dispositivos ROP para masajear los registros para que contengan los valores correctos, que luego pueden llamar al PLT.

    
respondido por el Polynomial 20.03.2015 - 15:18
fuente

Lea otras preguntas en las etiquetas