Attacco Return-to-libc con l'argomento letto dai registri (EDI / RDI)

2

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
    
posta user2808671 20.03.2015 - 11:16
fonte

1 risposta

3

Quello che stai guardando è un PLT, che è un modo di fare importazioni di librerie tardive. La "convenzione di chiamata" dei PLT non è standard, ma la toolchain di solito utilizza il passaggio dei parametri basato sul registro per le prestazioni, motivo per cui stai vedendo edi come indirizzo della stringa. La chiamata andrà a uno stub nella tabella di offset globale (GOT) che poi chiamerà nella funzione di libreria.

La risposta è , puoi sfruttarla con un ret2libc, ma non uno standard. Dovrai invece utilizzare una tecnica ret-to-plt, che è descritta in questo documento ( PDF). Il punto è che usi i gadget ROP per massaggiare i registri in modo da contenere i giusti valori, che possono quindi chiamare nel PLT.

    
risposta data 20.03.2015 - 15:18
fonte

Leggi altre domande sui tag