2015-02-10 17 views
5

Qual è un buon modo per contare in esadecimale e aggiungere il risultato alla fine di una stringa esadecimale più grande? Sto provando a formattare una stringa da utilizzare in un attacco oracle a padding. Le stringhe verranno concatenate insieme per formare una richiesta HTTP.Python - conteggio in esadecimale

Ho due stringhe esadecimali di 32 caratteri. 'g' è un'ipotesi, pad è l'oracle di riempimento. Fondamentalmente quello che devi fare è avere l'ultimo byte g contare in esadecimale da 0x00 a codice 0xff.The che ho finora è:

split = [value[x:x+32] for x in range (0, len(value), 32)] #Split the CT into 16 byte chunks 
IV = unhexlify(split[0]) 
c0 = unhexlify(split[1]) 
c1 = unhexlify(split[2]) 
c2 = unhexlify(split[3]) 


g = unhexlify("00000000000000000000000000000000") 
pad = unhexlify("00000000000000000000000000000001") 

pad_xor_guess = xorb(g, pad) 
c1_prime = xorb(pad_xor_guess, c1) 

attack = str(hexlify(c1_prime + c2).decode()) 

'attacco' sarà passato nel metodo query che aggiungerà la stringa di attacco all'indirizzo web. Ora la parte su cui sono bloccato è che devo sostanzialmente inviare fino a 256 richieste HTTP per indovinare un byte del testo in chiaro. Come posso usare un ciclo for per "contare" da 00 a ff, aggiungendo il risultato a g in modo tale che possa essere xo'd con il pad e il blocco di testo cifrato scelto? Finora ho percorso questa strada, ma sono bloccato su come farlo funzionare con le stringhe esadecimali.

for i in range(0, 20): 
    #g = bytes([i]) 
    print(bytes([i]),end=' ') 
    #print(g, end=' ') 
+4

' per i in range (255): hex (i) ' – user2097159

risposta

4

Per dato valore int, funzione esadecimale vi darà la stringa esadecimale preceduto con 0x, in modo esadecimale (i) [2:] vi dà la numero esadecimale per sé, zfill farà in modo di ottenere due cifre per i singoli numeri cifre

for i in xrange(256): 
    print hex(i)[2:].zfill(2) 

si potrebbe anche prendere in considerazione che rende tutti i tappi, dal momento che alcuni parser si basano su esadecimale viene scritto in lettere maiuscole, s o l'esempio sarà:

for i in xrange(256): 
    print hex(i)[2:].zfill(2).upper() 

E se avete solo bisogno la stringa completa, non è necessario aggiungere uno per uno, è possibile creare la stringa in un colpo solo:

hex_str = "".join([hex(i)[2:].zfill(2).upper() for i in xrange(256)]) 
3

Credo che si intende qualcosa di simile:

>>> for i in range(256): 
    print "{:02x}".format(i) # or X for uppercase 


00 
01 
02 
... 
fd 
fe 
ff