Prendere un po 'di output da xxd e trasformarlo a mano in shellcode utilizzabile non è divertente, quindi il tuo compito è automatizzare il processo.
Regole
L'invio può essere una funzione, lambda, script o qualsiasi equivalente ragionevole di quelli. È possibile stampare il risultato o se l'invio è una funzione / lambda, è possibile anche restituirlo.
È il programma deve prendere tre argomenti, il primo è una stringa contenente l'output di xxd, corse senza argomenti diversi da un nome di file, come questo: xxd some_file
. Ecco un esempio di come apparirà il primo argomento:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Devi prendere quella sezione centrale contenente i byte (le prime 8 colonne dopo la :
) e trasformarla in shellcode rimuovendo qualsiasi spazio bianco, quindi inserendo un \x
prima di ogni byte.
Ecco come dovrebbe essere l'output per l'input sopra (ignorando qualsiasi altro argomento):
\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
Puoi presumere che il primo argomento sarà sempre un output xxd valido, eseguito senza argomenti diversi dal nome file.
L'output dovrebbe anche essere una stringa in cui le barre rovesciate sono letterali barre rovesciate, non utilizzate come caratteri di escape. Quindi quando dico "\ x65", non sto parlando del byte 0x65, o anche della lettera "A". Nel codice, sarebbe la stringa "\ x65".
Il secondo argomento specifica dove dovrebbe iniziare lo shellcode nell'output xxd, mentre il terzo specifica dove dovrebbe finire. Se il terzo argomento è -1
, terminerà alla fine dell'output xxd. Anche il secondo e il terzo argomento saranno sempre non negativi, tranne quando lo è il terzo-1
Ecco alcuni casi di test:
Argomento 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Argomento 2:, 7
Argomento 3: e
(queste sono entrambe stringhe che rappresentano numeri esadecimali)
Produzione: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
Argomento 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Argomento 2:, 0
Argomento 3:2e
Produzione: \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e
Argomento 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Argomento 2:, a
Argomento 3:-1
Produzione: \xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
Vince il codice con il minor numero di byte. Il vincitore sarà annunciato tra sette giorni, il 15 agosto 2016 (ma le iscrizioni successive saranno ancora apprezzate).
Aggiornare
Congratulazioni a @Adnan per aver vinto la sfida!
~
invece di \x7e
. E possiamo tornare \t
invece di \x09
?
7
sembra un indice a base zero ed e
è un indice a base singola ( e-7=7
ma ci sono 8 codici esadecimali nel tuo output) o sto trascurando qualcosa?