Die Ausgabe von xxd von Hand in verwendbaren Shellcode umzuwandeln, macht keinen Spaß. Ihre Aufgabe ist es, den Prozess zu automatisieren.
Regeln
Ihre Einreichung kann eine Funktion, ein Lambda, ein Skript oder eine sinnvolle Entsprechung davon sein. Sie können das Ergebnis ausdrucken oder, wenn es sich bei Ihrer Einreichung um eine Funktion / Lambda handelt, auch zurücksenden.
Sie programmieren müssen drei Argumente, die erste eine Zeichenfolge ist , um die Ausgabe von xxd, lief ohne Argumente anders als ein Dateiname, wie diese enthalten: xxd some_file
. Hier ist ein Beispiel, wie das erste Argument aussehen wird:
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
Sie müssen diesen mittleren Abschnitt mit den Bytes (die ersten 8 Spalten nach dem :
) nehmen und ihn in Shellcode umwandeln, indem Sie Leerzeichen entfernen und dann \x
vor jedes Byte ein setzen.
Hier ist, was die Ausgabe für die Eingabe oben sein sollte (andere Argumente ignorieren):
\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
Sie können davon ausgehen, dass das erste Argument immer eine gültige xxd-Ausgabe ist, die ohne andere Argumente als den Dateinamen ausgeführt wird.
Ihre Ausgabe sollte auch eine Zeichenfolge sein, bei der die Backslashes wörtliche Backslashes sind und nicht als Escapezeichen verwendet werden. Wenn ich also "\ x65" sage, spreche ich nicht über das Byte 0x65 oder sogar den Buchstaben "A". Im Code wäre es die Zeichenfolge "\ x65".
Das zweite Argument gibt an, wo in der xxd-Ausgabe der Shellcode beginnen soll, und das dritte gibt an, wo er enden soll. Wenn das dritte Argument lautet -1
, endet es am Ende der xxd-Ausgabe. Das zweite und dritte Argument ist auch immer nicht negativ, es sei denn, das dritte ist-1
Hier sind einige Testfälle:
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
(beides Zeichenketten, die Hexadezimalzahlen darstellen)
Ausgabe: \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
Ausgabe: \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
Ausgabe: \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
Der Code mit den wenigsten Bytes gewinnt. Der Gewinner wird in sieben Tagen, am 15. August 2016, bekannt gegeben (Einreichungen danach sind jedoch weiterhin erwünscht).
Aktualisieren
Herzlichen Glückwunsch an @Adnan zum Gewinn der Herausforderung!
~
statt \x7e
. Und können wir \t
stattdessen zurückkehren \x09
?
7
sieht aus wie ein auf Null basierender Index und e
ist ein auf Eins basierender Index ( e-7=7
aber Ihre Ausgabe enthält 8 Hex-Codes), oder überseh ich etwas?