Originalcode:
[[ ! "${1////x}" =~ [[:alnum:]] ]]&&[[ $# = 1 ]]&&bash -c "$1"
Eingang:
__=; (( __++, __-- ));
(( ___ = __, ___++));
(( ____ = ___, ____++));
(( _____ = ____, _____++));
(( ______ = _____, ______++));
(( _______ = ______, _______++));
(( ________ = _______, ________++));
(( _________ = ________, _________++));
${!__##-} <<<\$\'\\$___$______$_______\\$___$______$_____\\$___$_______$__\\$___$_______$_________\'\ \$\'\\$___$___$__\\$___$______$_______\\$___$_______$______\\$___$_______$______\\$___$_______$_________,\ \\$___$____$_________\\$___$_______$_________\\$___$________$____\\$___$_______$______\\$___$______$______\\$__$______$___\'
Erläuterung:
Dies codiert "echo Hallo Welt!" als oktale Escape-Sequenzen (\ xxx).
Außer, dass Sie auch keine Zahlen verwenden können, baut der erste Teil Variablen für die Zahlen 0-7 auf. Sie können diese verwenden, um eine Zeichenfolge mit Oktalsequenzen zu erstellen, die ausgewertet werden, um den eigentlichen Befehl zu erhalten.
Ist eval
aber auch alphanumerisch. Stattdessen leitet dies diesen String als Eingabe an eine andere Instanz von weiter bash
. $0
enthält den Namen des Befehls, der zum Aufrufen von Bash verwendet wird. Dies ist normalerweise nur bash
(oder -bash
für eine Anmeldeshell) der Fall, wenn Sie es normal ausführen (über TIO oder durch Einfügen in ein Terminal). (Dies bedeutet im Übrigen, dass, wenn Sie versuchen, dies durch Einfügen in ein Skript auszuführen, die Dinge schrecklich schief gehen, da es einige Male versucht, sich selbst zu teilen.)
Aber das kann man sowieso nicht $0
direkt sagen . Stattdessen $__
enthält die Namen von $0
( „0“), und Sie können indirekte Erweiterung für den Zugriff verwenden es ( ${!__}
bezieht sich auf den Inhalt $0
).
Und das gibt Ihnen schließlich alle Teile, die Sie brauchen.
05AB1E , Adnan
Probieren Sie es online aus!
Wie?
quelle
total menschlich , Python 2
Eine Lösung ist
quelle
Pyth : Mr. Xcoder
G
ist das eingebaute Kleinbuchstaben. Der Code prüft die Gleichheit dagegen.quelle
Gelee: EriktheOutgolfer
Gelee , 11 Bytes
Probieren Sie es online aus!
Erläuterung
Der ursprüngliche Code kann als solcher erklärt werden:
Also nimm einfach "Hallo Welt!" und Codepunkte erhalten, quadrieren, auf Codepunkte zurückwerfen, fünfmal nach rechts drehen und dann das Ergebnis quadrieren und reduzieren.
quelle
Oktave von Stewie Griffin
Ich
\00
bin mir nicht sicher, ob dies die richtige Lösung ist (auf TIO wird das Zeichen gedruckt ), aber in meineroctave-cli
Shell sieht es so aus:Auch in der ursprünglichen Herausforderung heißt es, nichts drucken (oder das Nullzeichen) . Wenn also nichts mit dem übereinstimmt,
\00
sollte dies in Ordnung sein.Probieren Sie es online aus!
quelle
0
durch a10
).Hello, World!
und eine neue Zeile druckt." ist ein genaues Zitat aus der Herausforderung. Und das macht die Antwort trivial.Python 3 von rexroni
Verhindern Sie Fehler, indem Sie vorzeitig beenden.
Probieren Sie es online aus!
quelle
JavaScript (ES6) Von Ephellon Dantzler
{length:1, charCodeAt:()=>(e='Hello, World!', String.fromCharCode=()=>'')}
Probieren Sie es online aus!
Das war ziemlich einfach.
Mir ist aufgefallen, dass keine String-Eingaben ausgegeben werden können,
Hello, World!
da das GanzeString.fromCharCode
nur ein Vielfaches von 4!
zurückgibt und einen Zeichencode von 33 hat. Wir müssen also eindeutig nur das gesamte Programm hacken. Das Hacken von in JavaScript integrierten Funktionen ist trivial, wenn man nicht versucht, sie zu stoppen (und selbst wenn man dies tut, gibt es normalerweise viele Problemumgehungen ...).quelle
JavaScript (ES6), Voile
Einfacher Proxy, der nur bei jedem dritten Aufruf das gewünschte Zeichen zurückgibt.
Probieren Sie es online aus!
quelle
Ruby von Histocrat
Die magische Eingabe ist:
1767707618171221 30191World!
Probieren Sie es online aus.
Erläuterung:
1767707618171221
ist eine Primzahl und in Basis 36 geschrieben"hello"
. Bei Großschreibung entsteht"Hello"
, was mit gedruckt wird$><<
$><<", #$'"if/30191/
sucht nach der Zahl30191
in der Eingabe und schreibt, um eine Zeichenfolge zu stdouten, die aus einem Komma, einem Leerzeichen und allem, was in der Eingabe nach dem steht, verwendet wird30191
(unter Verwendung der$POSTMATCH
, auf die hier durch ihre kurze Variante verwiesen wird$'
).quelle
Lua 5.1 von tehtmi
Übergeben Sie dies als erstes Argument:
Angenommen, der ursprüngliche Code befindet sich in einer Datei
tehtmi.lua
, führen Sie ihn aus (in Bash oder einer ähnlichen Shell):Es funktioniert auch mit Lua 5.3, das von TIO verwendet wird. Warum probieren Sie es nicht online aus ? Ich habe noch keine Implementierung getestet, die den "PUC-Rios Lua 5.1" -Kern verwendet (weil ich keine Informationen finden kann), aber meine Lösung funktioniert wahrscheinlich auch dort.
Wie?
Das erste Argument wird als Code ausgeführt, jedoch nur, wenn es weniger als 5 Kleinbuchstaben enthält.
Der Trick ist zu rennen
print("Hello, World!")
. Eine andere Möglichkeit, dies auszuführen, ist die Verwendung_G["print"]("Hello, World!")
, bei der nur Zeichenfolgen verwendet werden.Aufgrund der Einschränkung der Anzahl der Kleinbuchstaben können wir die Zeichenfolge jedoch nicht direkt verwenden. Sie können jedoch ausführen
("").char
, um die Funktionstring.char
abzurufen, die von einer Reihe von Bytes in eine Zeichenfolge konvertiert werden kann. Ich habe es einer Großbuchstabenvariablen zugewiesen (damit wir das Limit nicht erreichen), damit wir damit sowohl dieprint
als auch dieHello, World!
Zeichenfolgen erstellen können, die wie oben verwendet werden können.quelle
next
stattdessenchar
Lua 5.3 zu verwenden, was aufgrund der Randomisierung der Iterationsreihenfolge nicht funktioniert.JavaScript (ES6) von Voile
Die Eingabe muss eine Zeichenfolge sein, die Folgendes enthält:
Probieren Sie es aus:
Wenn Sie sich nicht für die nachfolgende Newline-Anforderung für die Ausgabe interessieren, können Sie stattdessen die letzten 6 Zeilen durch folgende ersetzen:
Wie ich es gemacht habe
Die Einschränkungen für die Eingabe bestehen darin, dass es sich um eine Zeichenfolge handelt, jede Zeile zwei Byte lang oder weniger ist und dass die Gesamtlänge 80 Byte oder weniger beträgt. Mein erster Versuch, nachdem ich das richtig verstanden hatte, war folgender:
Hinweis: Die
\
s sollen die Zeilenumbrüche in der Zeichenfolge in der Eingabe ignorieren. Dies ist unglaublich wichtig für die Antwort, und ich kann nicht glauben, dass ich bei einem Unfall darauf gestoßen bin. (Ich war vorher damit vertraut, habe es aber vergessen)Dies hat aber nicht funktioniert, da das
=>
in der gleichen Zeile wie die Argumente stehen muss. Zum Glück hatte ich die Idee, etwas Ähnliches in eine Zeichenfolge zu wickeln und eine Auswertung in meine Eingabe einzufügen, um sie auf eine Zeile zu reduzieren, was zu meiner endgültigen Antwort führte. Nachdem die Auswertung in der Eingabe erfolgt ist, wird Folgendes als Zeichenfolge generiert (die dann zu einer Funktion ausgewertet und dann ausgeführt wird):Das war wirklich schwer zu knacken, aber am Ende war ich erfolgreich.
Auch der erste Riss überhaupt!
quelle
Kubisch von MD XF
Ich stelle mir vor, dass dies immer gefährlich ist, aber ich denke, ich habe einen Riss, bis ich richtig bin, dass der Interpreter einen Fehler enthält (den ich gerade kompiliert habe).
Mein Input
Die Ausgabe erfolgt
Hello, World!\n\n\n\n\n\n\n\n\n\n.....
mit endlosen Zeilenumbrüchen.Aber ich habe den letzten Codeabschnitt bemerkt:
0x0A
Setzt den Notizblock auf beängstigende Weise auf (Zeilenumbruch), liest die Eingabe auf Seite 7 (die Eingabefläche) und druckt dann die 6-Seite (Notizblockfläche) wiederholt, bis die 7-Fläche Null ist. Wenn Sie Gesicht 7 auf Null setzen, sollten Sie nur eine neue Zeile erhalten. Ich habe jedoch unendlich viele Zeilenumbrüche erhalten und meine 13. Eingabe war eine Null. Ich kann überprüfen, ob die 7-Fläche immer Null ist, indem ich eine "Drucknummer von 7-Fläche" in die Schleife einfüge:dann werden endlose
\n0
Paare gedruckt .Ich schaue mir die Spezifikationen auf der kubischen Github-Seite an und dieses Verhalten sieht sehr nach einem Fehler aus. Das Ändern des letzten Zeichens des ursprünglichen Programms von a
7
in a0
führt zu dem erwarteten Verhalten. Der TIO-Interpreter zeigt dasselbe falsche Verhalten.quelle
CJam , Erik der Outgolfer
Probieren Sie es online aus!
Wie?
quelle
C # (.NET Core) , Grzegorz Puławski
Die Lösung, die ich gefunden habe, verwendet sehr stark nicht druckbare Zeichen, sodass der Versuch, sie hier einzufügen, nicht gut funktioniert hat. Die Bytewerte für die Eingabe sind:
Oder die String-Version ist im Eingabefeld des TIO-Links verfügbar.
Probieren Sie es online aus!
Das ursprüngliche Programm würde die unterschiedlichen Zeichen in der Eingabe übernehmen, dann die Eingabe umkehren und die Elemente der beiden Listen multiplizieren. So habe ich eine 26 Zeichen lange Zeichenfolge erstellt, in der die ersten 13 Zeichen unterschiedlich waren, die letzten 13 Zeichen auch in den ersten 13 Zeichen erschienen und jedes Indexpaar
[i, 26-i]
mit dem Bytewert des i-ten Zeichens in multipliziert wurdeHello, World!
.quelle
Ly , LyricLy
Versuchen Sie es hier (obwohl die Seite den Zeilenumbruch nicht rendert).
n
nimmt Eingaben entgegen, versucht, Leerzeichen aufzuteilen und in Ints umzuwandeln, diese werden auf den Stapel gelegt.o
druckt Ordnungspunkte und8+
tut, was man denken würde. Die Eingabe muss also 8 weniger sein als die Codepunkte in umgekehrter Reihenfolge, geteilt durch Leerzeichen.quelle
2
dass es funktionieren würde - ist das nur die Herokuapp-Seite, die es nicht rendert?C (gcc) von Felix Palmen
Originalcode:
Argumente:
Probieren Sie es online aus!
Erläuterung:
W(c)
berechnet die Adresse einer Zeichenfolge aus der auszudruckenden Argumentliste. Es beginnt mit der Adresse des c-ten Arguments (O(c)
), das in diesem Fall das 42. Argument ist, subtrahiert dann das erste Zeichen des zweiten Arguments (**O(2)
) als ganzzahligen Offset und addiert dannx
die Anzahl der Argumente.W(c)
verwendet das zweite Argument, sodass Sie wissen, dass mindestens drei davon vorhanden sein müssen (0, 1, 2). Dann "Hallo Welt!" kann in das erste Argument gehen, und um dieses Argument anzusprechen, benötigen Sie ein Zeichen, dessen ASCII-Wert in die Gleichung "42-x + 3 = 1" passt. Das ist zufällig ",".quelle
JavaScript: ThePirateBay
Ich überschreibe die
valueOf()
undtoString()
Methoden der analysierten Objekte, so dass der Zwang mit a fehlschlägtTypeError
.quelle
6502 Versammlung (C64) - Felix Palmen
Die Erklärung ist etwas kompliziert.
Der Code sucht zuerst nach einem Komma (Syntaxnotwendigkeit) und liest dann zwei Argumente ein, von denen das erste ein WORD ist, das im Speicher 0014 und 0015 als Little-Endian gespeichert ist, wobei das letztere im X-Register gespeichert ist.
Das ist ziemlich klug, wenn wir unsere Eingabe verwenden, um das Programm neu zu schreiben. Am Ende des Programms wird schließlich der Zähler für die Ausgabeschleife neu geschrieben.
Hier kommt der hinterhältige Teil:
Auf dem C64 ist d018 ein sehr wichtiges Byte. Es speichert die Referenzpunkte für Dinge, die die Ausgabe des Bildschirms betreffen. Sehen Sie hier für weitere Informationen. Wenn dies einen falschen Wert ergibt, stürzt Ihr C64 ab. Um die erforderlichen gemischten Groß- und Kleinbuchstaben zu drucken, müssen dies 17 US-Dollar sein.
Jetzt beginnen wir unsere Ausgabeschleife:
Diese Konstante wurde zuvor überschrieben. Es wird klar bestimmt, wie lange die Schleife läuft. Es ist zwar schon der richtige Wert, aber wir müssen dort wieder 0e halten.
Der Rest sind nur die Informationen, die wir ausdrucken müssen, beginnend mit der Speicheradresse c025.
Also folgt es nur der Mathematik von dort.
quelle
$FF
dort, entschied mich dann aber, ihn zu verlassen.6502 Maschinencode (C64) - Felix Palmen
Die richtige Antwort ist
Der Code ist ziemlich kompliziert und erfordert viel Selbständerung. Anstatt es vollständig zurückzuentwickeln, können Sie es einfach verwenden, um sich selbst zu knacken.
Hier ist eine etwas hilfreichere Demontage des Codes, um zu verstehen, was passiert ist. Die Syntax ist für KickAssembler.
Das Beschriften so hat mir gereicht, um zu sehen, dass der Code XOR eine Reihe von Konstanten enthält, die versteckt sind, um auszudrucken, was wir brauchen. Da XOR reversibel ist, werden Sie bei Eingabe der gewünschten Ausgabe über den Schlüssel informiert.
Also habe ich die letzte Zeile gewechselt
Es würde also die letzte erforderliche Eingabe drucken, anstatt bei einer falschen Eingabe abzustürzen.
Und das ist das!
Wenn es Interesse gibt, werde ich den Code mehr knacken.
quelle
vice
drops A in mystery+1, over the constant
" <- das ist eigentlichmystery+4
mit deinem Label. Offests sind in Bytes :) und FWIW, Selbstmodifikation ist selbst in ernsthaftem 6502-Code ziemlich häufig , solange der Code aus dem RAM ausgeführt wird.Explodiere , Step Hen
Probieren Sie es online aus!
quelle
C (tcc) von Joshua
Probieren Sie es online aus!
quelle
MATL von Luis Mendo
Probieren Sie es online aus!
quelle
Gelee von Jonathan Allan
Originalcode:
Probieren Sie es online aus!
Eingang:
Erläuterung:
quelle
C (GCC auf TIO) von MD XF
Probieren Sie es online aus!
Wie?
Es wird versucht, das zweite Argument als Zeichenfolge zu drucken. Dies ist ein Zeiger, den wir anhand der Eingabe bestimmen können. Es kommt einfach so vor, dass am Speicherort
4195875
die"Hello, World!\n"
Zeichenfolge beginnt .Die Zahl wurde durch Addieren
print("%p", "Hello, World!");
vorprintf
, Konvertieren der Hexadezimalzahl in Dezimalzahl und Ausprobieren auf dem ursprünglichen TIO ermittelt. Es zeigte mir jedoch dieprintf
Formatzeichenfolge. Beim Ausprobieren einiger Zahlen stellte ich fest, dass sich die Zeichenfolge vor der Formatzeichenfolge befindet.Im Speicher würde es also so aussehen (als C-Zeichenfolge):
Dies bedeutet auch, dass ein Update des Compilers die Lösung beschädigen kann.
quelle
JavaScript (Node.js) von Voile
['Hello, World!','','','','','','','','','','','','']
Probieren Sie es online aus!
quelle
Röda von fergusq
Probieren Sie es online aus!
Erklärung kommt ein bisschen ...
quelle
JavaScript (ES6), Voile
Probieren Sie es online aus!
quelle
PHP von LP154
Probieren Sie es online aus!
(In TIO ist die PDO-Klasse nicht definiert, daher verwendet die obige Demo ein Codepad, das dies tut.)
Eine andere Lösung:
Probieren Sie es online aus!
quelle
JavaScript (ES6), Voile
Angesichts der Beschränkung auf 81 Zeichen ist dies wahrscheinlich nicht die beabsichtigte Lösung
Probieren Sie es online aus!
quelle