Prendre un peu de sortie de xxd et le transformer à la main en shellcode utilisable n'est pas amusant, donc votre travail consiste à automatiser le processus.
Règles
Votre soumission peut être une fonction, un lambda, un script ou tout équivalent raisonnable de ceux-ci. Vous pouvez imprimer le résultat, ou si votre soumission est une fonction / lambda, vous pouvez également la renvoyer.
Vous devez programme prendre trois arguments, la première étant une chaîne contenant la sortie de xxd, RAN sans argument autre qu'un nom de fichier, comme ceci: xxd some_file
. Voici un exemple de ce à quoi ressemblera le premier argument:
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
Vous devez prendre cette section du milieu contenant les octets (les 8 premières colonnes après le :
) et le transformer en shellcode en supprimant les espaces, puis en mettant un \x
avant chaque octet.
Voici ce que la sortie devrait être pour l'entrée ci-dessus (en ignorant tout autre argument):
\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
Vous pouvez supposer que le premier argument sera toujours une sortie xxd valide, exécutée sans autre argument que le nom de fichier.
Votre sortie doit également être une chaîne où les barres obliques inverses sont des barres obliques inverses littérales, non utilisées comme caractères d'échappement. Donc quand je dis "\ x65", je ne parle pas de l'octet 0x65, ni même de la lettre "A". Dans le code, ce serait la chaîne "\ x65".
Le deuxième argument spécifie où dans la sortie xxd le shellcode doit commencer et le troisième spécifie où il doit se terminer. Si le troisième argument est -1
, il se terminera à la fin de la sortie xxd. Les deuxième et troisième arguments seront également toujours non négatifs, sauf lorsque le troisième est-1
Voici quelques cas de test:
Argument 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
Argument 2:, 7
Argument 3: e
(ce sont les deux chaînes représentant des nombres hexadécimaux)
Production: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
Argument 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
Argument 2:, 0
Argument 3:2e
Production: \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
Argument 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
Argument 2:, a
Argument 3:-1
Production: \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
Le code avec le moins d'octets gagne. Le gagnant sera annoncé dans sept jours, le 15 août 2016 (mais les candidatures après cette date sont toujours appréciées).
Mise à jour
Félicitations à @Adnan pour avoir remporté le défi!
~
au lieu de \x7e
. Et pouvons-nous revenir \t
au lieu de \x09
?
7
ressemble à un index à base zéro et à e
un index à base unique ( e-7=7
mais il y a 8 codes hexadécimaux dans votre sortie), ou suis-je en train d'oublier quelque chose?