Ho letto che per realizzare un attacco return-to-libc di successo, l'attacker dovrebbe memorizzare l'indirizzo del comando (ad esempio /bin/sh
) nello stack esattamente dopo l'indirizzo di ritorno della funzione system
( per esempio). In questo modo la funzione system()
legge quell'indirizzo come suo parametro ed esegue quel comando. Ma ora dopo aver disassemblato un programma che chiama system()
ho notato che non usa lo stack per ottenere l'indirizzo di quella stringa ( "/bin/sh"
). Invece l'indirizzo è memorizzato nei registri EDI o RDI. Fino a quando l'attaccante non può accedere ai registri come è possibile eseguire tale attacco?
Ecco un semplice esempio:
int main(int argc,char **argv){
system("id");
return 0;
}
E il disassemblato:
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