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