Programmazione orientata al ritorno: l'indirizzo di system () contiene un byte NULL

1

Dichiarazione di non responsabilità: sto facendo questa domanda esclusivamente a scopo didattico.

Sto cercando di concatenare alcune chiamate di funzione usando la programmazione orientata al rendimento, sfruttando un binario vulnerabile che usa strcpy() . Una di queste chiamate di funzione dovrebbe essere una chiamata a system() (per eseguire qualche comando di shell). Sfortunatamente, l'indirizzo di system() contiene un byte NULL che guiderà per strcpy() per interrompere la copia del payload una volta osservato questo byte.

La mia domanda quindi è: qual è l'approccio migliore per risolvere questo problema?

Ho già controllato la libc per funzioni simili a system() , ma non ho trovato nulla. Un'altra mia idea sarebbe quella di chiamare fork() , exec() e wait() successivamente. Ciò tuttavia aumenterebbe la complessità del payload.

    
posta foobar 19.11.2018 - 18:16
fonte

1 risposta

1

C'è qualche motivo per cui è necessario lasciare in vita il processo originale quando viene eseguito lo shellcode? Chiama solo execve direttamente (assumendo che tu possa controllare lo stack abbastanza bene), o una delle sue funzioni di supporto , che trasformerà il processo corrente nel processo di destinazione.

Un approccio più complesso che potrebbe funzionare è utilizzare dlsym per recuperare un puntatore a system , che puoi chiamare con il tuo comando di destinazione. potresti dover chiamare prima dlopen , però; Non sono sicuro della semantica di dlsym . La corrispondente funzione di Windows GetProcAddress prende l'indirizzo di base del modulo caricato (libreria o eseguibile) come primo puntatore e dlsym potrebbe fare lo stesso; dal momento che stai usando ROP presumibilmente non ti preoccupi di ASLR, quindi l'indirizzo dovrebbe essere prevedibile.

Infine, dal momento che stai usando ROP, puoi semplicemente trovare uno o più gadget che ti permettono di produrre aritmeticamente l'indirizzo desiderato. Ci sono molte combinazioni di operandi (costanti nel tuo shellcode, registri o indirizzi con valori noti al momento dello sfruttamento, ecc.) E operazioni (add, sottrarre, o, xor, ecc.) Che potrebbero essere usate per produrre un valore specifico che contiene un byte NULL da pezzi che non ne contengono uno e le operazioni ALU sono brevi, quindi non dovrebbe essere difficile trovare i gadget adatti.

    
risposta data 20.11.2018 - 01:48
fonte

Leggi altre domande sui tag