Perché utilizzare l'operatore XOR o OR per "bypassare" un salto condizionale

0

Al momento sto lavorando a una sfida su root me ma ho dovuto leggere la soluzione su internet perché non potevo progredire più. Ho letto questo articolo che parla della sfida a cui sto lavorando attualmente.

Sta "bypassando" (non so se è il termine giusto) l'istruzione JNS usando:

(gdb) set $eflags = $eflags ^ 128

E anche la JNE che utilizza:

(gdb) set $eflags = $eflags | 64

Qualcuno può spiegare perché sta usando l'operatore XOR o OR? E perché con il valore 128 e il valore 64?

EDIT: Questa è una domanda che ho già chiesto su StackOverflow ma nessuno ha risposto.

    
posta S7_0 25.07.2016 - 14:54
fonte

1 risposta

2

We are now at the JNS instruction. This means Jump Short if Not zero
...
So lets go back to where the JNS instruction was and unset the SF flag so the jump gets executed. SF is the 7th bit in the register so in order to cancel it we need to xor with 2^7 = 128

In realtà c'è un errore nella prima frase qui, JNS significa "Salta se non firma", cioè il salto viene eseguito se il flag di segno è non impostato. La seguente logica è valida: decide che vuole che il salto sia preso, altrimenti il programma uscirà. Quindi il bit del segno dovrebbe essere cancellato .

Come dice, il segno è il bit 7 , un xor con 128 (= 2 ^ 7, o 0b10000000 in binario) lo capovolgerà. (il risultato di un xor è 1 se esattamente uno dei bit di input è 1 .) Dal momento che ha controllato poco prima che il bit fosse impostato, non c'è alcun rischio di accidentalmente accidentalmente po. Generalmente si and con l'inverso (cioè 127, o 0b01111111 ) per cancellare il bit. (il risultato di and è 1 se esattamente entrambi gli input sono 1 .) Wikipedia, tra le altre, ha tavole di verità per le funzioni logiche.

Nel secondo caso, il bit in posizione 6 deve essere impostato e or con 64 (= 2 ^ 6 o 01000000). (il risultato di or è 1 se almeno un bit di input è un 1 .) Potrebbe aver usato xor per attivarlo anche, ma ciò richiederebbe di nuovo il controllo se il il bit è impostato per primo.

    
risposta data 25.07.2016 - 15:41
fonte

Leggi altre domande sui tag