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!
la source
~
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?Réponses:
05AB1E ,
3938 octetsSaisie sous forme:
Code:
Explication:
Utilise l' encodage CP-1252 . Essayez-le en ligne! .
la source
Bash + coreutils + xxd,
737169 octetsAttend l'hexdump sur STDIN et start / end comme arguments de ligne de commande.
Cela affiche certains avertissements dans STDERR, ce qui est autorisé par défaut.
la source
xxd
sa solution!16#
par0x
?xxd
chose, mais cela semble fonctionner partout.0xn
style hexadécimal et0m
octal hors de la boîte: gnu.org/software/bash/manual/bash.html#Shell-Arithmetic .echo $[0x2a] $[052]
.JavaScript, 84 octets
Explication: supprime toutes les parties indésirables du vidage, ajoute
\x
à chaque paire hexadécimale, puis extrait la partie souhaitée du résultat.||u
est utilisé pour convertir le zéro obtenu en incrémentant le-1
paramètre dansundefined
lequel est une valeur magique qui provoqueslice
le découpage à la fin de la chaîne. 101 octets sif
ett
sont des chaînes de chiffres hexadécimaux:la source
(s,f,t,u)=>
, vous pouvez le faires=>f=>t=>u=>
pour économiser quelques octets.u
doit être un paramètre supplémentaire et ne peut pas être curry.Rubis:
9089877963 octets-2 octets grâce à @addison
-8 octets grâce à @PiersMainwaring
Voir les tests sur repl.it: https://repl.it/Cknc/5
la source
.join
par*""
pour économiser 2 octets..map{|h|h.to_i(16)}
par.map(&:hex)
pour économiser 8 octets supplémentaires!.hex
les arguments individuellement!Gelée ,
4844 octetsCela attend l'hexdump comme unique argument de ligne de commande, et les points de fin et de début sur STDIN, dans cet ordre, séparés par un saut de ligne.
Essayez-le en ligne!
la source
PowerShell v2 +,
175157142133129 octetsPrend entrée
$a
,$b
,$c
, avec$a
comme étant soit un littéral chaîne séparée saut de ligne ou avec le PowerShell`n
caractère séparant les lignes. Nous définissons la chaîne d'aide$z
comme fortement traitée$a
comme suit -Nous
-split
commençons d' abord par des sauts de ligne, puis, pour chaque ligne|%{...}
, nous coupons la section du milieu[10..48]
, utilisons le-ne32
pour supprimer les espaces,-join
le remettons ensemble en une longue chaîne,-split
sur tous les deux caractères (en gardant les deux caractères) et-ne''
pour supprimer les éléments vides. Il en résulte un tableau de chaînes à deux éléments, comme('31','c0','b0'...)
.Nous découpons ensuite ce tableau en fonction de la
$b
conversion avec l'opérateur hexadécimal jusqu'à la valeur de$c
. Nous avons besoin d'utiliser un pseudo-ternaire ici que les comptes pour savoir si$c
est-1
ou non. Si tel est le cas, nous choisissons.count
(c'est-à-dire l'élément final) de$z
. Sinon, nous ajoutons simplement l'0x
opérateur hexadécimal$c
à une chaîne. Notez qu'il s'agit d'un index zéro.Cette tranche de tableau a ses éléments
-join
édités avec un littéral\x
pour former une chaîne. C'est ajouté avec un autre littéral\x
et le résultat est laissé sur le pipeline. L'impression est implicite.Exemple
la source
Gelée ,
393837 octetsEssayez-le en ligne!
Bat maintenant 05AB1E! (malgré le manque de "conversion de hexadécimal" intégré)
Même format d'entrée que la solution de Dennis .
Utiliser
Ɱ
, qui est une nouvelle fonctionnalité (abréviation deЀ
). Sans cela, cela prendrait 38 octets.la source
Perl, 114 octets
Arguments donnés sur la ligne de commande sous la forme d'une chaîne entre guillemets suivie de deux nombres. Les nombres sont pris en décimal (je sais que hex a été utilisé dans les exemples mais il n'a pas été spécifié dans le post)
Techniquement, ne fonctionne que sur les entrées avec jusqu'à 2 ^ 21 octets car la méthode de sous-chaîne de Perl est idiote
la source
7
àe
devrait se traduire par une chaîne de longueur 32.Python, 140 octets
https://repl.it/ClB3
Fractionne la chaîne d'origine et vide les éléments s'ils contiennent moins de cinq caractères, les préfixe
\x
et les tranches par les deuxième et troisième arguments.Version de 162 octets si nous devons gérer d'autres types de sortie non spécifiés par la question:
la source
00000030: 5858 58 XXX
car elle retirera la dernière partie et vous obtiendrez quelque chose comme\x58\x58\x58\xXX\xX
.xxd
sorties utilisées comme argument à la place. "Voici un exemple de ce à quoi ressemblera le premier argument:"Python 2 et 3 -
164 162 150 146 134150 octetsAccepte désormais les chaînes hexadécimales pour les deuxième et troisième arguments.
la source
Python 3.5, 125 octets
Non golfé:
la source