for(i=0; i<length(password)-1;
i++){
   update_keys(password(i))
}
Ecco la definzione di update_keys():
update_keys(char){
   Key(0) = crc32(key(0), char)
   Key(1) = Key(1) + (Key(0) & 0x000000FF)
   Key(1) = Key(1) * 134775813 + 1
   Key(2) = crc32(key(2), key(1) >> 24)
}
Il prototipo
di crc32 e': crc32(old_crc, char);
Questa routine dato un CRC e un carattere, ritorna un nuovo CRC applicando
un algo di CRC-32 che ora vi spiego perche' e' banalissimo:
questa bestia di algoritmo e' stata creata da David Schwaderer ;p e funziona
in maniera davvero semplice, il magic value e' rappresentato dal numero: 0xdebb20e3,
il registro utilizzato per il calcolo del CRC e' posto di default a -1 ovvero:
0xFFFFFFFF e viene aggiornato prendendo il complemento a uno del risultato
del CRC. Ok e' finito, sono 10 righe di asm ma ve l'ho messo giusto per completezza.
Fase 2:
Questa fase e' stata introdotta per rendere piu' difficile il plaintext attack,
vediamo cosa fa:
Leggi i 12byte dell'encryption header e mettili in:
char buffer[12] (i dati ovviamente partono a Buffer[0] e terminano a Buffer[11])
for(i=0; i<12;
i++){
char C = buffer[i] ^ decrypt_byte() // Ovviamente
il simbolo ^ rappresenta lo XOR.
update_keys(C)
buffer(i) = C
}
Ecco la definizione di decrypt_byte():
unsigned char
decrypt_byte(){
local unsigned short temp
temp = Key(2) | 2 //
Il | e' l'OR
decrypt_byte = ((temp * (temp ^ 1)) >> 8) //
Ihihihih
}
Dopo che l'header
e' stato decrittato gli ultimi 1 o 2 byte di "buffer" sono il byte/word
alti del CRC del file che stiamo decrittando. Dalla versione 2.0 di pkzip
in poi viene usato un byte per il CRC invece di due, come invece accadeva
nelle versioni precedenti e viene utilizzato per verificare se la password
immessa e' esatta o meno (traccia).
Fase 3:
A questo punto il decrypting diventa banale:
loop until done{
read a character into C
Temp = C ^ decrypt_byte()
update_keys(temp)
output Temp
}
Ed ora vi chiederete: che dobbiamo fare? Aprite il Winzip, spiegate come arrivare
alle routine, ovviamente trovate le tre routine e spiegate l'algoritmo che
utilizza il WinZip, se avete voglia anche le sue differenze con quello di
PKzip, una volta fatto questo proponete un metodo di attacco efficiente e
dite se secondo voi l'algoritmo presenta delle falle, una c'e' di sicuro,
poi a fine corso tutti assieme potremo tirare su un tool per sfruttarla, potete
utilizzare la mailinglist per progredire nei vostri lavori e potete anche
riunirvi in gruppo, buon divertimento.
Ah, io ho impiegato due giorni (in pratica poche ore) per studiare il tutto,
percio' un mese dovrebbe andar bene anche per i piu newbies vista la banalita'
degli algoritmi utilizzati.