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!
quelle
~
statt\x7e
. Und können wir\t
stattdessen zurückkehren\x09
?7
sieht aus wie ein auf Null basierender Index unde
ist ein auf Eins basierender Index (e-7=7
aber Ihre Ausgabe enthält 8 Hex-Codes), oder überseh ich etwas?Antworten:
05AB1E ,
3938 BytesEingabe in das Formular:
Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
Bash + Coreutils + xxd,
737169 BytesErwartet den Hexdump auf STDIN und start / end als Befehlszeilenargumente.
Dadurch werden einige Warnungen an STDERR ausgegeben, was standardmäßig zulässig ist.
quelle
xxd
in seiner Lösung verwenden!16#
durch0x
?xxd
Sache, aber es scheint überall zu funktionieren.0xn
Hex- Style- und0m
Oktal-Style-Nummern sofort : gnu.org/software/bash/manual/bash.html#Shell-Arithmetic .echo $[0x2a] $[052]
.JavaScript, 84 Bytes
Erläuterung: Entfernt alle unerwünschten Teile des Speicherauszugs
\x
, stellt jedes Hex-Paar voran und extrahiert dann den gewünschten Teil des Ergebnisses.||u
wird verwendet, um die Null zu konvertieren, die durch Inkrementieren des-1
Parameters erhalten wird. Hierbeiundefined
handelt es sich um einen magischen Wert, der dazu führtslice
, dass das Ende der Zeichenfolge durchschnitten wird. 101 Bytes, wennf
undt
Zeichenfolgen aus Hexadezimalziffern sind:quelle
(s,f,t,u)=>
können Sies=>f=>t=>u=>
einige Bytes einsparen.u
muss dies ein zusätzlicher Parameter sein und kann nicht verwendet werden.Ruby:
9089877963 Bytes-2 Bytes dank @addison
-8 Bytes dank @PiersMainwaring
Siehe die Tests auf repl.it: https://repl.it/Cknc/5
quelle
.join
mit*""
zu speichern 2 Byte..map{|h|h.to_i(16)}
mit.map(&:hex)
8 Bytes mehr zu retten!.hex
die Argumente einzeln aufzurufen !Jelly ,
4844 BytesDies erwartet den Hexdump als einziges Befehlszeilenargument und die End- und Startpunkte auf STDIN in dieser Reihenfolge, getrennt durch einen Zeilenvorschub.
Probieren Sie es online!
quelle
PowerShell v2 +,
175157142133129 ByteNimmt die Eingabe
$a
,$b
,$c
, mit$a
entweder als eine Neuen - Zeile - Literal-Zeichenkette getrennt oder mit dem Power`n
Charakter die Linien trennen. Wir setzen den Helferstring wie folgt$z
stark bearbeitet$a
:Zuerst haben wir
-split
auf neue Zeilen, dann für jede Zeile|%{...}
, in Scheiben schneiden wir den mittleren Abschnitt[10..48]
, verwenden Sie die-ne32
Räume zu entfernen,-join
sie wieder zusammen in einer langen Reihe,-split
es auf je zwei Zeichen (wobei die beiden Zeichen) und-ne''
die leeren Elemente zu entfernen. Dies führt zu einem Array von Zeichenfolgen mit zwei Elementen, wie z('31','c0','b0'...)
.Wir schneiden dann in dieses Array, basierend auf der
$b
Umwandlung mit dem hexadezimalen Operator bis zum Wert von$c
. Wir müssen hier einen Pseudoternären verwenden, der erklärt, ob dies der Fall$c
ist-1
oder nicht. Wenn ja, wählen wir das.count
(dh das Endelement) von$z
. Ansonsten stellen wir dem0x
hexadezimalen Operator nur$c
eine Zeichenfolge voran . Beachten Sie, dass dies nullindiziert ist.Die Elemente dieses Array-Slice werden
-join
mit einem Literal\x
zu einer Zeichenfolge zusammengefasst. Dem steht ein weiteres Literal voran,\x
und das Ergebnis wird in der Pipeline belassen. Drucken ist implizit.Beispiel
quelle
Jelly ,
393837 BytesProbieren Sie es online!
Jetzt schlägt 05AB1E! (trotz fehlender "hexadezimaler Konvertierung" eingebaut)
Gleiches Eingabeformat wie die Lösung von Dennis .
Verwenden Sie
Ɱ
, was eine neue Funktion ist (Abkürzung fürЀ
). Ohne dies würde dies 38 Bytes dauern.quelle
Perl, 114 Bytes
Argumente, die in der Befehlszeile in Anführungszeichen gefolgt von zwei Zahlen angegeben werden. Die Zahlen sind dezimal (ich weiß, hex wurde in den Beispielen verwendet, aber es wurde nicht in der Post angegeben)
Funktioniert technisch nur bei Eingaben mit bis zu 2 ^ 21 Bytes, da Perls Teilstring-Methode albern ist
quelle
7
ane
in einer Reihe von Länge zur Folge haben sollte 32Python, 140 Bytes
https://repl.it/ClB3
Teilt die ursprüngliche Zeichenfolge auf und gibt die Elemente aus, wenn sie weniger als fünf Zeichen haben, voranstehen
\x
und durch das zweite und dritte Argument getrennt werden.162-Byte-Version, wenn wir andere Ausgabetypen verarbeiten müssen, die in der Frage nicht angegeben sind:
quelle
00000030: 5858 58 XXX
da sie den letzten Teil herauszieht und Sie ungefähr so etwas erhalten\x58\x58\x58\xXX\xX
.xxd
stattdessen auch eine andere Ausgabe als Argument verwendet werden kann. "Hier ist ein Beispiel, wie das erste Argument aussehen wird:"Python 2 und 3 -
164 162 150 146 134150 BytesAkzeptiert jetzt hexadezimale Zeichenfolgen für das zweite und dritte Argument.
quelle
Python 3.5, 125 Bytes
Ungolfed:
quelle