Xor
- Xor, chi era costui? Bene raga, questo è il primo articolo della
UIC e vorrei iniziare col parlarvi dello Xor che è la più comune forma di crittazione
usata per i vari seriali e password, ma anche per nascondere da occhi indiscreti una
stringa, l'articolo avrà un'impronta tecnica dal momento che le varie tecniche di Xoring
vi verranno illustrate e spiegate alla meglio dal mio amico T3x (dico bene T3x? :).
- C'mon baby, la parola Xor non è altro che l'abbreviazione del
termine "Exclusive Or", in italiano "Or esclusivo", ma per capire come
funziona dobbiamo parlare per prima cosa dell'OR. Se mentre debuggate vi doveste trovare
davanti una cosa del genere:
-
- xxxx:0040123456
OR eax, 64h
("h" stà per esadecimale)
-
- e non sapete a cosa serva, ecco che vi vengo in aiuto io, poniamo
il caso che in eax sia contenuto il valore 58h, cosa fa l'OR? Semplicissimo, per
prima cosa converte i due numeri da esadecimali in binari cioè:
-
- eax = 58h = 1011000
- 64h = 1100100
-
- e poi ne fa un confronto con i criteri appunto.........dell'OR :))
per ora vi mostro il risultato e poi ve lo spiego:
-
- 1011000 OR
- 1100100 =
- ---------------
-
1111100 = 7c
-
- il motivo per il quale è uscito 7c è che l'OR opera in questo
modo:
-
-
A B | X
0 0 | 0
A or B = X
0 1 | 1
0 0 | 1
0 1 | 1
-
- cioè, riporta una valore 0 (FALSO) solo se nel confronto tra due
membri del numero trova due zeri, altrimenti, qualunque siano i valori (1 e 0, 0 e 1, 1 e
1) riporta 1 (cioè vero). Ma parliamo dello XOR, prendiamo i due numeri e convertiamoli
in forma binaria:
-
- eax = 58h = 1011000
- 64h = 1100100
-
- li Xoriamo e divengono:
-
- 1011000 XOR
- 1100100 =
- ---------------
-
0111100 = 3c
-
- tutto ciò perchè lo XOR riporta un valore di 0 se due membri del
numero sono uguali ed un valore di 1 se due membri sono diversi, comunque ecco la consueta
tabella:
-
-
A B | X
0 0 | 0
A xor B = X
0 1 | 1
1 0 | 1
1 1 | 0
-
- Vi starete chiedendo: ma come si xorano le password?
- Bhè il meccanismo vero e proprio vi verrà spiegato da T3x,
comunque il modo più semplice è quello di decidere una password, xorarla con un valore,
poi prendere la password inserita, xorarla con lo stesso valore e vedere se combaciano,
ecco un esempio in codice assembly:
- ------------------------------------8< Start code
----------------------------------------
.286
- .molel small
- .stack 100h
-
- .DATA
-
- Password db 04Ch
; poniamo il caso che questo sia il
; numero 5 xorato con un valore
-
; di 20h (è sparato a caso)
-
- Bravo db
' Bravo!!! ', 0Dh, 0Ah, '$'
- Errato
db ' Hai sbagliato!!! ', 0Dh, 0Ah, '$'
-
- ; supponiamo anche di avere in eax il numero inserito da voi, non
scrivo il codice perchè per il momento non vi interessa e poi
diventa un turorial sull'assembly :))))
-
.CODE
- start:
-
mov ax, @data
-
mov ds, ax
-
mov es, ax
-
xor eax, 20h
; xora il
numero inserito con 20h
-
cmp Password, eax ; è uguale alla nostra
pass?
-
jne Errore
;
No? esci dal prog
-
mov dx, offset Bravo ; Si? Digli che è bravo
-
mov ah, 09h
; e srivi
che ha azzeccato sullo schermo
-
int 21h
-
mov ah, 4ch
; torna al
DOS
-
int 21h
Errore:
-
mov dx, offset Errato
-
mov ah, 09h
; mostra la stringa "hai errato"
-
int 21h
-
ret
-
- end start
-
- --------------------------------------8< End code
-----------------------------------------
-
- Bhè questo è il codice scritto alla meno peggio, comunque serve
a farvi capire, se volete prendere dimistichezza con lo XOR, scaricate qui un programma che ho scritto io in C (non vi aspettate gran che) con
tanto di sorgente, il programma xora un numero inserito da voi con un valore inserito da
voi (il risultato lo da in decimale), divertitevi, ciauzzzzzz.
Quequero
-