Conversione del decimale negativo in esadecimale

3

Ho trovato un post sulla sicurezza offensiva e durante la lettura, l'autore ha dichiarato che:

At next SEH (when using a SE Handler address that starts with a null byte), we usually will put some code to jump back. After all, the null byte would acts as a string terminator and it does not make sense to put something after the SE Handler address (after all, you would not be able to jump to it anyway, right ?)

Typically, in a scenario like this, we want to do a short jump back… this jumpback opcode looks like this :xebxf0xffxff (so basically, jump back 10 bytes)

Quindi, come da mia comprensione, per tornare indietro, devo convertire il valore decimale in esadecimale (sto usando questo [printf "%x\n" -7] nella mia shell come un modo rapido per convertire da -7 a hex) quindi aggiungere questo valore a l'istruzione jmp \xeb .

Ho 2 domande qui:

1 - il formato finale dell'opcode dovrebbe essere \xeb\xAA\xBB\xCC\xDD (l'istruzione di salto \xeb seguita da 4 byte), tuttavia, l'autore include solo 3 byte dopo \xeb ? c'è una percentuale mancante di\xff?

2 - l'autore afferma che \xeb\xf0\xff\xff salta indietro di 10 byte, tuttavia, l'ho convertito da solo e ho scoperto che il salto indietro di 10 byte dovrebbe essere \xeb\xf6\xff\xff invece di \xeb\xf0\xff\xff che salta indietro di 16 byte?

    
posta Ahmed Taher 28.07.2013 - 05:20
fonte

1 risposta

4

Ci sono molti opcode di salto; guarda i manuali di Intel. Raccomando il manuale originale 80386 che parla solo dell'80386 a 32 bit, eliminando così tutte le funzionalità extra di ulteriori CPU: questo renderà molto più facile la lettura più breve .

Vai a pagina 319 di quel manuale: vedrai che, a livello di codice macchina, non ci sono meno di 21 codici operativi di salto distinti. Quello che inizia con EB è un salto breve, seguito da un singolo byte, consentendo quindi un intervallo di salto da -128 a +127 byte. Il dislocamento viene contato dal byte che immediatamente segue l'intera istruzione (il primo byte dopo il parametro di spostamento di un byte), quindi EB 00 è una non operazione: salta all'istruzione che segue il salto, dove sarebbe andato comunque se non ci fosse stato alcun salto. Allo stesso modo, EB FE è un ciclo infinito (torna a se stesso). EB F0 salta indietro di 16 byte, quindi 14 byte prima del EB byte.

Nota: diffidare della dualità a 16 bit / 32 bit dei processori x86. Tutti i sistemi operativi moderni funzionano in modalità a 32 bit. Questo non cambia nulla per il "salto corto" di cui stiamo parlando qui, ma altera "near jumps" che prenderà un offset di spostamento a 32 bit in modalità a 32 bit.

    
risposta data 29.07.2013 - 15:22
fonte

Leggi altre domande sui tag