Inspiriert von diesem Kommentar ...
Vielen Dank an die Benutzer Step Hen , Wheat-Wizard und Dennis, die mir geholfen haben, die Spezifikation dieser Herausforderung zu konkretisieren, bevor sie veröffentlicht wurden!
Dies ist der Thread der Cops. Für den Faden Robbers, gehen hier
In dieser Herausforderung müssen Sie Code ausführen, der dafür sorgt, dass Ihre Sprache unsere Kriterien als Programmiersprache nicht mehr erfüllt. In dieser Herausforderung heißt das, es so zu machen, dass die Sprache nicht mehr ...
Zahleneingabe und -ausgabe übernehmen
Addiere zwei Zahlen
Testen Sie, ob eine bestimmte Zahl eine Primzahl ist oder nicht.
Dies ist eine Cops-and-Robbers- Herausforderung, bei der es zwei unterschiedliche Herausforderungen mit zwei unterschiedlichen Zielen gibt: Die Cops werden versuchen, Code zu schreiben, der die Sprache größtenteils unbrauchbar macht, und die Räuber werden versuchen, die verborgene Problemumgehung zu finden, die es den Cops ermöglicht ihre Sprache wiederzugewinnen.
Als Cop müssen Sie zwei Codeausschnitte schreiben:
Eine, die Ihre Sprache größtenteils unbrauchbar macht, z. B. indem integrierte Funktionen für Eingabe / Ausgabe und numerische Operationen entfernt werden. Je mehr Features Sie entfernen, desto besser. Dieser Code darf nicht abstürzen oder beendet werden. Es sollte möglich sein, Code am Ende dieses Snippets hinzuzufügen, und dieser Code wird ausgewertet . Und...
... ein Codeausschnitt, der zwei nicht negative Ganzzahlen als Eingabe verwendet, sie addiert und ihre Summe ausgibt. Dieses Snippet muss auch nach dem Ausführen des ersten Snippets noch ordnungsgemäß funktionieren. Wenn die beiden Ausschnitte miteinander kombiniert werden, müssen sie ein vollständiges Programm bilden, das zwei Zahlen hinzufügt, oder eine Funktion definieren, die zwei Zahlen hinzufügt. Im Idealfall sollte sich dieses Snippet auf ein sehr undurchsichtiges Verhalten stützen, damit es schwieriger zu finden ist.
Sie können eine beliebige Standardmethode für die Eingabe und Ausgabe auswählen . Sie müssen jedoch genau angeben, welches Format (Eingabe und Ausgabe) Sie verwenden. Ein Räuber kann Ihre Antwort nur knacken, wenn er dasselbe Format wie Sie verwendet.
Nachdem Sie diese beiden Ausschnitte geschrieben haben, müssen Sie den ersten als Antwort veröffentlichen, ohne den zweiten preiszugeben. Ihre Antwort sollte alle folgenden Informationen enthalten:
Der erste Ausschnitt (offensichtlich nicht der zweite).
Sprache (einschließlich Nebenversion, da die meisten Einsendungen wahrscheinlich auf seltsamen Randfällen beruhen)
IO-Format, einschließlich, ob es sich um eine Funktion oder ein vollständiges Programm handelt. Räuber müssen dasselbe Format verwenden, damit ihr Riss gültig ist.
Irgendwelche seltsamen Randfälle, die erforderlich sind, damit Ihre Antwort funktioniert. Läuft beispielsweise nur unter Linux oder erfordert eine Internetverbindung . Das ist natürlich ein bisschen subjektiv, aber wenn ein Cop einen extremen Kantenfall hat, der ein Knacken verhindert, und dies erst dann aufdeckt, wenn er in Sicherheit ist, dann halte ich das für eine schlechte Sportlichkeit. Ein potenzieller Räuber sollte über alle Informationen verfügen, die erforderlich sind, um Ihre Antwort zu knacken, bevor sie geknackt wird.
Sie müssen Ihre Byteanzahl erst bekannt geben, wenn Ihre Antwort sicher ist.
Hier ist ein Beispiel. Für das erste Snippet können Sie das folgende Python 3-Programm einreichen:
Python 3
print=None
Übernimmt die Eingabe von STDIN und gibt sie an STDOUT aus
Und dann könnten Sie als zweites Snippet schreiben:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Dies ist gültig, da zwei Zahlen als Eingabe und Ausgabe ihrer Summe verwendet werden, auch wenn Sie die beiden Ausschnitte zusammenfügen, z
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Dies wird jedoch für einen Räuber extrem einfach zu lösen sein. Da dies sehr einfach zu knacken wäre, könnten Sie versuchen, diesen bestimmten Ansatz wie folgt zu patchen:
import sys
sys.stdout=None
print=None
Selbst dies hat jedoch eine sehr einfache Problemumgehung:
del print
a,b=int(input()),int(input())
print(a+b)
Als Polizist ist es Ihr Ziel, die verborgene Problemumgehung so dunkel wie möglich zu gestalten, um zu verhindern, dass die Räuber sie finden.
Die Räuber sehen sich eine Ihrer Antworten an und versuchen, sie zu knacken. Sie können es knacken, indem sie ein gültiges Snippet schreiben , das als Snippet 2 funktionieren könnte (indem sie zwei Zahlen addieren, nachdem die Sprache größtenteils unbrauchbar gemacht wurde). Dies muss nicht dasselbe Snippet sein, das Sie ursprünglich beabsichtigt haben. Wenn ein Räuber Ihre Antwort knackt, hinterlässt er einen Kommentar zu Ihrer Antwort, und Sie sollten ihn bearbeiten, um anzuzeigen, dass er geknackt wurde. Wenn Ihr Beitrag geknackt ist, sollten Sie Ihre Antwort bearbeiten, um die Lösung (Snippet 2) anzuzeigen, die Sie ursprünglich beabsichtigt haben. Dies ist an sich keine Regel , sondern nur ein freundlicher Vorschlag, um das Spiel unterhaltsam zu gestalten. Du musst nicht.
Wenn eine Antwort eine Woche lang nicht geknackt ist, können Sie sie in Ihrem zweiten Snippet bearbeiten und darauf hinweisen, dass Ihre Antwort jetzt sicher ist . Wenn Sie es nach Ablauf der Woche nicht bearbeiten, können andere Benutzer es trotzdem knacken, bis Sie dies tun. Wenn Sie Ihr zweites Snippet nicht offenlegen, können Sie für Ihre Antwort keine Punkte beanspruchen oder es als sicher bezeichnen.
Der Gewinner des Cops-Threads ist die kürzeste sichere Antwort, einschließlich beider Ausschnitte , die in Bytes gezählt werden. Diese Antwort wird akzeptiert, wenn genügend Zeit verstrichen ist. Sie nicht benötigen eine Byteanzahl zu offenbaren , bis die Antwort sicher ist, da Byteanzahl , um Ihre Gäste irrelevant ist , bis die Antwort sicher ist. Wenn genügend Zeit verstrichen ist und keine Antworten ungerissen bleiben, ist der Gewinner die Antwort, die am längsten ungerissen geblieben ist.
Habe Spaß!
Regelklärungen
Das erste Snippet muss korrekt ausgeführt werden, ohne dass Eingaben erforderlich sind . Die Ausgabe kann beliebig sein, und diese Ausgabe wird ignoriert - solange das Snippet fertig ist, wird das zweite Snippet korrekt ausgeführt.
Das zweite Snippet muss tatsächlich ausgeführt werden, damit Ihre Antwort gültig ist. Dies bedeutet eine Antwort wie
import sys sys.exit()
ist nicht gültig, weil es die Sprache nicht bricht. Es hört einfach auf. Ebenso ist die Eingabe einer Endlosschleife nicht gültig, da das zweite Snippet niemals ausgeführt wird.
Nachdem Sie sicher sind, ist Ihre Punktzahl die Byteanzahl beider Snippets .
Dies geht zurück auf Bitte enthüllen Sie alle seltsamen Randfälle, die erforderlich sind, damit Ihre Antwort funktioniert . Ihre Einreichung muss genügend Informationen enthalten, bevor sie enthüllt wird, damit sie nach der Enthüllung reproduzierbar ist. Dies bedeutet, dass, wenn Ihre Antwort sicher ist, Sie Folgendes bearbeiten: Hier ist meine Antwort. Oh ja, übrigens funktioniert dies nur, wenn Sie es unter Solaris ausführen. Ihre Antwort ist ungültig und wird gelöscht und gilt nicht als gewinnberechtigt.
Das zweite Snippet kann nach der Ausgabe der Summe abstürzen - solange die Ausgabe noch korrekt ist (wenn Sie sich beispielsweise für die Ausgabe in STDERR entscheiden und dann eine Reihe von Absturzinformationen erhalten, ist dies ungültig).
Sie können Ihren Code nach dem Absenden einer Antwort nicht bearbeiten.
Sie können sich möglicherweise nicht auf kryptografische Funktionen wie Verschlüsselung, Hash-Funktionen, CSPRNGs usw. verlassen.
Ausschnitt, um ungerissene Beiträge zu finden:
quelle
int main(){ do_evil_stuff(); }
wohin soll der Benutzercode gehen? In einer Funktion? Nach all den Aussagen inmain
?Antworten:
Gforth 0.7.3 (TIO) , 231 Byte [SICHER]
Dieser Code definiert einige notwendige Ausgabemethoden sowie die Addition und etwas Entscheidendes zum Deklarieren von Funktionen als nutzlos. Viel Glück!
Die Eingabe erfolgt über zwei Ganzzahlen mit Vorzeichen, die als Funktionsparameter am oberen Rand des Stapels abgelegt werden. Ausgabe an STDOUT.
Sie sollten also den verursachten Schaden beheben und eine Funktion definieren, die die beiden obersten Werte aus dem Stapel entnimmt und das Ergebnis als Ganzzahl (kein Gleitkomma) ohne zusätzliche Ausgabe (kein Leerzeichen) an STDOUT ausgibt.
Hier ist eine Vorlage , wenn Ihre Zielfunktion benannt ist
f
.Lösung:
quelle
Haskell, geknackt von Christian Sievers
Vollständiges Programm, das zwei ganze Zahlen (einschließlich negativer) von stdin liest und in stdout schreibt.
Ich habe gerade das Prelude deaktiviert, sodass fast nichts im Geltungsbereich ist, und dann eine Definition hinzugefügt. weitere Importe sind syntaktisch ungültig. Ich gab dir
getLine
undprint
obwohl.Bearbeitet, um meine ursprüngliche Lösung hinzuzufügen. Christians Crack war anders, nutzt jedoch die gleichen Grundfunktionen (Sie können überraschend viel Rechenaufwand erzielen, indem Sie auf Funktionen mit syntaktischem Zucker zugreifen, selbst wenn Sie nichts Eingebautes direkt aufrufen oder die beteiligten Typen benennen können).
Was wahrscheinlich sowieso nicht super ist, aber hier ist es besser lesbar:
quelle
Python 2 , geknackt
Implementiert die Addition als benannte Funktion
Probieren Sie es online!
Was macht das?
Um Ihnen ein wenig zu helfen, erkläre ich, was dies bewirkt. Dieser Code öffnet die Quelldatei und prüft, ob der Rest des Codes den folgenden Kriterien entspricht:
import
&)(,.:[]a`cdfijmonrt~
Wenn eines der beiden Kriterien nicht erfüllt ist, wird das Rekursionslimit so festgelegt,
1
dass jeder von Ihnen geschriebene Code das Rekursionslimit erreicht.Hier gibt es keine Tricks. Ich habe eine Lösung geschrieben, die nur diese Zeichen und keine Importe verwendet. Ich mache nichts Subversives, aber ich werde sagen, dass ich denke, dass dies ziemlich schwer zu knacken sein wird.
Um Ihnen Zeit zu sparen, finden Sie hier eine kurze Liste nützlicher Dinge, die Sie mit dieser Einschränkung nicht tun können
+
gut duh,eval
/exec
Wollte dich damit nicht davonkommen lassenZahlen, sie könnten nützlicher sein als Sie denken
String-Literale
len
=
, Keine Zuweisung von Variablen>
,<
,==
. . . Ich habe dich ohne Vergleiche gelassen*
,-
,/
,%
,^
,|
,>>
,<<
Die einzigen Betreiber zur Verfügung stehen~
und&
__foo__
, Keine dieser ausgefallenen Methoden mit doppeltem Unterstrich ist zulässig.quelle
This code is not allowed to crash or exit.
(Siehe Chat für die Diskussion darüber)Python 2 , geknackt
Dies ist die vierte Iteration dieser Antwort. Jede der letzten Antworten wurde durch Zurücksetzen der Rekursionstiefe geknackt.
Implementiert die Addition als benannte Funktion
Probieren Sie es online!
Was macht das?
Um Ihnen ein wenig zu helfen, erkläre ich, was dies bewirkt. Dieser Code öffnet die Quelldatei und prüft, ob der Rest des Codes nur aus den Zeichen besteht
&)(,.:[]a`cdfijmonrt~
Wenn dies fehlschlägt, wird das Rekursionslimit so festgelegt,
1
dass jeder von Ihnen geschriebene Code das Rekursionslimit erreicht.Ich habe auch alle Module deaktiviert, sodass Sie nichts importieren können.
Hier gibt es keine Tricks. Ich habe eine Lösung geschrieben, die nur diese Zeichen und keine Importe verwendet. Ich mache nichts Subversives, aber ich werde sagen, dass ich denke, dass dies ziemlich schwer zu knacken sein wird.
Um Ihnen Zeit zu sparen, finden Sie hier eine kurze Liste nützlicher Dinge, die Sie mit dieser Einschränkung nicht tun können
+
gut duh,eval
/exec
Wollte dich damit nicht davonkommen lassenZahlen, sie könnten nützlicher sein als Sie denken
String-Literale
len
=
, Keine Zuweisung von Variablen>
,<
,==
. . . Ich habe dich ohne Vergleiche gelassen*
,-
,/
,%
,^
,|
,>>
,<<
Die einzigen Betreiber zur Verfügung stehen~
und&
__foo__
, Keine dieser ausgefallenen Methoden mit doppeltem Unterstrich ist zulässig.Meine Lösung
Nun, da xnor es so geknackt hat, dass ich mit meiner Lösung zufrieden genug bin, werde ich sie offenbaren
Überraschen, überraschen, es ist ein riesiger Haufen Kauderwelsch. Anstatt das aufzuschlüsseln, gehe ich den Prozess durch, wie ich das gemacht habe.
Ich habe mit einem ziemlich normalen Additionsalgorithmus begonnen
Dann habe ich einen bitweise Trick für die Darstellung
^
mit|
,&
,~
.Ich habe einen anderen bitweisen Trick benutzt, um das loszuwerden
|
Jetzt ist nur noch das übrig
<<
, sollte nicht zu schwer sein, oder? Nun mach dich bereit für eine holprige Fahrt. Um die Bitverschiebung zu ersetzen, habe ich Strings verwendet, um eine Null an das Ende der Binärdarstellung anzuhängenDies hat ein paar Probleme, aber das primäre Problem ist die Verwendung von Addition. Daher habe ich dies mithilfe eines Formats umgangen
Wir dürfen bin nicht verwenden, daher habe ich die Zeichenfolgenformatierung verwendet, um in binär zu konvertieren.
Da String-Literale verboten sind, muss ich den String
{0:b}0
aus Teilen zusammensetzen, die mit Back Ticks gemacht wurdenjoin
.Die leere Zeichenfolge ist ziemlich einfach, das können Sie einfach tun
Die Nullen waren
und die
{:}
wurden alle aus Wörterbüchern gepackt.b
scheint ziemlich schwer zu bekommen, es ist nicht in unserem Zeichensatz, also wie sollen wir ein Objekt bekommen, das einb
in seinem hatrepr
?repr
Und so geht's: Wenn Sie eine eingebaute Funktion verwenden, erhalten Sie etwas, das aussiehtUnd von dort beziehen wir unsere
b
.Jetzt sind nur noch Zahlen übrig, ich brauche nur noch -1, 0, 1 und 2, und so habe ich sie dargestellt:
2 könnte eigentlich ein Byte kürzer sein als
basierend auf @ Blenders Vorschlägen in den Kommentaren, aber daran habe ich erst nachträglich gedacht.
Also setzen wir diese Zahlen in ein
Und das ist der Riss.
quelle
C (gcc) geknackt!
Probieren Sie es online!
Eingabe von STDIN und Ausgabe an STDOUT.
Dies läuft ohne Fehler. Hahaha das ist ziemlich böse. Ich habe es nur auf TIOs gcc getestet. Normalerweise müssen Sie Ihren Code nach diesem Snippet anhängen, damit er funktioniert :) Der Kommentar ist gemein, hören Sie ihn sich nicht an.
Getestet am
gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
. Sollte auf jedem Linux-System funktionieren.Originelle Lösung
quelle
__asm__
und Sie haben viele Funktionen zur Auswahl :) Denken Sie nicht, dass C und C ++ hier gute Feinde sind.Haskell , geknackt von Ben
Probieren Sie es online! Dies sollte ein vollständiges Programm sein, das zwei Zahlen von stdin liest und die Summe an stdout ausgibt.
Jedes vollständige Programm startet mit der Ausführung der
main
Funktion,main
ruft sich jedoch selbst auf und führt zu einer Endlosschleife. Um die Sache noch schlimmer zu machen, wird ein Zeilenkommentar--
direkt hinter dem rekursiven Aufruf gestartet , um zu verhindern, dass dieser in z. B.main2
geändert wird und dann definiert wird, dass die Summierung durchgeführt wird.Beabsichtigte Lösung:
Probieren Sie es online!
--
Startet einen Zeilenkommentar, es sei denn, er kann auch als Teil eines Operators analysiert werden. (Die Syntaxhervorhebung scheint sich dieser Tatsache nicht bewusst zu sein.) Es--$
handelt sich um einen gültigen Infix-Operator, dermain
als erstes Argument und als zweites Dummy-Argument verwendet wird()
. Es wird dann definiert, beide Argumente zu ignorieren und stattdessen die erforderliche Aufgabe auszuführen.quelle
C (GCC unter Linux) (geknackt)
Anstatt dumme Sandbox-Techniken zum Lesen von Dateien zu verwenden, machen wir es auf die richtige Art und Weise - mit SECCOMP Whitelisting!
Ihre Aufgabe: Addition mit Eingabe von STDIN und Ausgabe nach STDOUT implementieren.
Probieren Sie es online!
Was zur Hölle ist das!?
Um Ihnen bei Ihrer unüberwindlichen Aufgabe zu helfen, erkläre ich, was dieser Code bewirkt.
__attribute__ ((constructor(0)))
Stellt sicher, dass dies
Funktion zuerst ausgeführt wird. Die Funktion schließt alle offenen Dateideskriptoren für STDIN, STDOUT und STDERR. Dann beschränkt sich das Programm auf eine strikte SECCOMP-Whitelist, die Ihre Systemaufrufe auf Folgendes beschränkt:Daher können Sie keine neuen Dateien öffnen (oder im Grunde nichts tun). Wir kommen dann zu main und rufen Ihren Code auf, schön in die
sandbox
Funktion eingepackt .Das
syscall(SYS_exit, EXIT_SUCCESS);
am Ende ist nur, um sicherzustellen, dass das Programm sauber beendet wird - standardmäßig wird GCC beendet,exit_group(2)
was von der SECCOMP-Whitelist nicht erlaubt ist. Diese Exit-Funktion wird aufgerufen, nachdem Ihr Code ausgeführt wurde.Sie haben also keine offenen Dateideskriptoren und können nichts Neues öffnen. Unmöglich, richtig? ;)
quelle
x86 16 Bit Real Mode Assembly ( geknackt )
Einfach, wenn Sie den Trick kennen.
quelle
or [bp], 256
ist sie ungültig. Soll das so seinor WORD PTR [bp], 256
?)hlt
Befehls (Ring 0) stark impliziert, dass dies kein geschützter Modus ist.Your submission must contain enough information before being revealed to be reproducible after being revealed
Javascript, geknackt
Diese Herausforderung baut auf der von Grant Davis auf , behebt jedoch die von ihm geplante Lösung (die einen Iframe erstellt und den Iframe verwendet
window
). Die Lösung wird in der Javascript-Konsole auf Chrome ausgeführtabout:blank page
und benötigt zweiinput()
Sekunden, addiert sie undconsole.log
ergibt das Ergebnis. Gib deinen Code nachher ein:Zuerst quatschen wir
prompt
undconsole
und legen die Verknüpfung festd
. Dann erstellen wir einen Mutationsbeobachter mit einem Rückruf, der jedes mutierte Ziel entfernt. Wir stellen diesen Mutationsbeobachter so ein, dass er das Dokument beachtetchildList
undsubtree
Änderungen mitteilt. Anstelle destrue
Buchstabens verwenden wir unsere Abkürzung zum Wahrheitswertdocument
(die Spezifikation erlaubt dies nicht, Chrom jedoch).Nachdem ich dies gepostet hatte, bemerkte ich einen viel eleganteren Clobber. Meine vorgesehene Lösung funktioniert immer noch, aber der eingestellte Riss funktioniert nicht:
quelle
Perl 5, geknackt von Ilmari Karonen
Die Eingabe wird in separaten Zeilen von empfangen
STDIN
und die Ausgabe wird auf gedrucktSTDOUT
.Der gesamte Code folgt dem
__DATA__
Marker. Hierbei wird eine ähnliche Methode wie bei der @ WheatWizard-Lösung verwendet, bei der der Code analysiert und nicht verwendbare Zeichen entfernt werden.Dies wurde in den Versionen 5.8, 5.10 und 5.16 getestet und erfordert keine Befehlszeilenflags.
Probieren Sie es online!
quelle
STDIN
mit Zeichen in separaten Zeilen undSTDOUT
. Ich werde dies zum Hauptteil hinzufügen.Python 3, geknackt von zbw
Alle Module wurden gelöscht, dh es sind keine eingebauten Module verfügbar und es kann nicht viel mehr getan werden. Ausgabe nach STDOUT, Eingabe von STDIN. Dies ist die zweite Iteration dieser Antwort, nachdem die vorherige durch einen unbedeutenden Riss durch Hinzufügen einer break-Anweisung unterbrochen wurde.
quelle
APL (ngn-apl) , geknackt von ngn
In Zusammenarbeit mit meinem Kollegen Marshall gemacht .
Eingabe durch linke und rechte Argumente bis
+
. Dh Ihr Ziel ist es, Code nach dem Folgenden einzufügen, so dass Ihre letzte Zeile STDOUT liest⎕←3+2
und ausgibt5
.Probieren Sie es online!
Stellt alle nützlichen Funktionen ein, für
{}
die ein oder zwei Argumente erforderlich sind, und gibt eine leere numerische Liste zurück. Legt auch fest⍣
, dass nur Funktionen erstellt werden.Riss
⍺⍵1/0
repliziere 0 durch das linke Argument und das rechte Argument und 1⍋
erhalten Sie die Indizes, die das sortieren würden (da alle Elemente null sind, gibt es 0 1 2… (a + b)⌈/
der Maximalwert (a + b)quelle
+
bei der nur reine APL und keine schmutzigen Tricks verwendet werden.Python 2 , geknackt
Dies ist die zweite Iteration einer Antwort, die von @HyperNuetrino mit einer Methode geknackt wurde, die ich nicht erwartet hatte. Ich habe es jetzt so gepatcht, dass hoffentlich die einzigen verbleibenden Lösungen die von mir beabsichtigten Einschränkungen einhalten müssen.
Implementiert die Addition als benannte Funktion
Probieren Sie es online!
quelle
u
, aber ich stecke ohne sie fest.u
?.count
. Ich kann einen String so lang wie die gewünschte Ausgabe bekommen, aber ich habe keine Möglichkeit, seine Länge zu bestimmen.__import__('sys').setrecursionlimit(100)
... und tatsächlich wurde nichts geflickt. Ich habe aber nicht wirklich Lust, es in den Thread des Räubers zu schreiben, ich habe Lust zu schummeln. Versuchen Sie es onlineJava 8, Gebrochen von @ OlivierGrégoire
Hier ist mein Versuch. Die Idee ist, einfach alle Namespaces zu überladen, die Sie für die Ausgabe verwenden können (und zu reflektieren, hoffe ich). Die Ausgabe soll sdout (System.out).
Blacklisting ist in der Regel ein schlechterer Ansatz als Whitelisting. Ich bin sicher, es ist nur eine Frage der Zeit, bis jemand einen Ansatz findet, über den ich nicht nachgedacht habe.
quelle
class String{}
nach dem Testen hinzugefügt , ohne zu merken, dass es ausfallen würdemain(String[] ...)
. Es sollte jetzt funktionierenint sum = 0; new Exception("" + sum) { public void printStackTrace() { ClassLoader cl = ClassLoader.getSystemClassLoader(); try { printStackTrace(new PrintStream((PrintStream)cl.loadClass("java.lang.System").getDeclaredField("out").get(null))); } catch (Exception e){} } }.printStackTrace();
cQuents, von Mayube geknackt
Das sollte ziemlich einfach sein, aber man weiß es nie.
Das "Problem" war, dass ohne
C
in Ihrem Code, Sie einen Fehler bekommen haben.Mayubes Lösung:
Jedes Element in der Sequenz ist die erste Eingabe plus das zweite Mal die dritte (auch bekannt als 1).
Meine Lösungen:
Die Sequenz wechselt zwischen dem ersten Eingang plus dem zweiten Eingang und dem dritten Eingang (1). Der erste Punkt im zweiten ist
A+B
.Ähnlich wie bei Mayubes Lösung - anstatt zu multiplizieren
B*C
, wird es einfach addiertC
und dann subtrahiert.Probieren Sie es online!
Erläuterung
Derzeit gibt dieses Programm aus
1
, da ohne Benutzereingabe die erste Eingabe die erste1
in der Standardeingabe (#
) ist.quelle
Default input is combined with user input to form the total input, which must align with the expected input (which is based on the highest input requested by the Sequence Definition)
A,B,C,D,E
im Code abgefragt wird . Wenn Sie beispielsweise die Variable zu einem beliebigen ZeitpunktD
in Ihrem Programm haben, erwartet der Parser 4 Eingaben, aber wenn es auch eine gibtE
, erwartet der Parser, dass es 5 Eingaben gibt. Es kann nicht weniger als die erwartete Menge sein. Es gibt jedoch immer eine optionale letzte Eingabe,n
die von verschiedenen Modi auf unterschiedliche Weise verwendet wird.A
, also sucht es nach einem Eingang. Da es zwei gibt, von#
denen beide die Standardeingabe angeben, wird der erste alsA
Wert und der zweite als Wert verwendetn
.BC
, wäre A die erste Eingabe, B wäre die zweite, C wäre 1 und n wäre die zweite 1?#1,1
(kein Balken), wäre dies: A als erste 1, B als zweite 1, C als erste Eingabe und n als zweite Eingabe. Sie können auch Folgendes tun#1|1
: A ist die erste 1, B ist die erste Eingabe, C ist die zweite Eingabe und n ist die zweite 1.Node.JS Version 7.3.0 (geknackt von Dom Hastings)
Platzieren Sie den zweiten Codeblock nach dem ersten.
Haftungsausschluss: Der zweite Codeblock funktioniert nicht von alleine (ohne nach dem ersten platziert zu sein). Wenn dies jedoch nicht erlaubt ist, kann ich das zweite Snippet ändern.
Dies ist ein volles Programm. Ausgabe ist
process.stdout
(STDOUT), Eingabe istprocess.argv
(Befehlszeilenargumente)Dies ist meine erste Polizei und Räuber, hoffentlich ist dies eine gute Herausforderung :)
Probieren Sie es online!
Die Herausforderung erklärt
Erzeugt eine Zufallsvariable
n
von 0 bis 1e7. Wenn Sie schreiben mit der richtigen nennenn
, druckt nicht alles , aber setztl
auf 0 , die die Schreibfunktion „entriegelt“, so dass Sie etwas drucken. Wenn Sie versuchen, write mit einer Nicht-Zeichenfolge aufzurufen, werden Sie in eine Endlosschleife versetzt. Wenn Sie versuchen, write mit etwas anderem als dem richtigen aufzurufen,n
während write "gesperrt" ist, werden Sie in eine Endlosschleife geschickt, um das Erraten zu verhindern.Die beabsichtigte Lösung
Schleicht an dem Typ vorbei, der anscheinend nur mithilfe eines Symbols nach Zeichenfolgen sucht, das ebenfalls mit s beginnt. Dies löst einen Fehler in der Funktion aus, der sich aus dem eval-Aufruf ergibt, da Sie die Zeichenfolge "f" nicht zu einem Symbol hinzufügen können. Wir fangen den Fehler ab und verwenden Regex, um
n
den Stack-Trace wiederherzustellen , der im Namen der Funktion enthalten ist. Dann versuchen wir zu schreiben,n
was nichts druckt, sondern setzen die Variable "lock"l
auf 0, um die Schreibfunktion "freizugeben". Jetzt, da die Schreibfunktion freigeschaltet ist, geben wir nur die Summe aus.quelle
RProgN2 , Gebrochene von Arnold Palmer
Schreibt über alle mathematischen Operatoren, ohne dass diese wiederhergestellt werden können. Insbesondere werden sie durch eine Funktion ersetzt, die die beiden obersten Elemente auf dem Stapel entfernt.
Probieren Sie es online!
Ursprüngliche Lösung
Probieren Sie es online!
quelle
²
Symbol bewirkt. Möchtest du mich aufklären?[[
in diesem Fall die nächsten beiden Konzepte und umhüllt sie mit einer Funktion @ArnoldPalmer«»
wäre es sehr hilfreich gewesen , lokale Variablen zu erstellen, anstatt globale zu vermasseln.Haskell,
161144 Bytes, Cracked by BlackCapEingang zu STDIN, Ausgang zu STDERR. Fügen Sie am Ende des Programms hinzu.
Bearbeiten: Soll ohne zusätzliche GHC-Argumente kompiliert werden, nur die normale
ghc --make prog.hs
.Erneut bearbeitet, um die Anzahl der Bytes zu verringern.
Habe Spaß!
quelle
main = do x <- readLn :: IO Integer; y <- readLn; print $ x + y
main
Funktion im Modul befindet,Main
wenn kein-main-is
Flag bereitgestellt wird.Mascarpone , geknackt von Ilmari Karonen
Die Eingabe erfolgt über Stdio-Kirchennummern, wobei
i
für Inkrement undz
für Null verwendet wird. Zum Beispiel wäre 2 + 3:Mit einem nachgestellten Zeilenumbruch
sollte Output eine Zahl auf stdout sein, im selben Format wie auf stdio. Wenn die Antwort beispielsweise fünf ist, sollten Sie Folgendes ausgeben:
(Mascarpone hat kein Konzept von Zahlen)
Beabsichtigte Lösung:
Es ist nicht sofort aus der Dokumentation ersichtlich, aber wie @IlmariKaronen in seinem Riss feststellte, sind String-Literale in Mascarpone tatsächlich syntaktischer Zucker, um eine Folge von Zeichen zu verschieben.
Ich habe absichtlich Kommentare geschrieben
[this]$
, um es so aussehen zu lassen, als würde ich eine Schnur drücken und sie unmittelbar danach knallen lassen. Ein naiver Cracker hätte vielleicht versucht[:,>!]/*
, eine Zeichenfolge zu verschieben, mit dem Interpreter zu tauschen und zu interpretieren.Ich tue auch so, als würde ich den Interpreter, mit dem ich auf dem Stack belassen habe
$
,$
in eine NOP umdefinieren. Sie haben diesen Interpreter auf dem Stack und müssen ihn durch das gesamte Programm mit sich führen. durch jedes Zeichen jeder Zeichenfolge.quelle
C # (.NET Core) Gebrochen von Ilmari Karonen
Auch von Joshua geknackt .
Liest die beiden Werte aus stdin und schreibt das Ergebnis in stdout. Getestet unter Windows mit Framework Version 3, 4.6 und TIO .
Hier ist das vollständige Programm, das ich beabsichtigt hatte.
Probieren Sie es online!
quelle
GolfScript , geknackt von Dennis
Probieren Sie es online!
Dies ist schließlich eine Code-Golf- Herausforderung. Warum also nicht GolfScript ausprobieren?
Eine gültige Lösung sollte ein Snippet sein, das zwei Ganzzahlen vom Stapel liest, sie addiert und das Ergebnis auf dem Stapel zurückgibt. Der Haken ist, dass es auch dann noch funktionieren sollte, wenn der obige Code fast alle integrierten GolfScript-Operatoren neu definiert hat , um absolut nichts zu tun. Zumindest bin ich
;
unberührt geblieben, so dass Sie immer noch Werte vom Stapel werfen können. ;-) Dein Code sollte auf dem Standard GolfScript Interpreter funktionieren, wie er zB auf TIO implementiert ist (siehe Link oben).Dennis 'Lösung basiert wie meine eigene auf der selten verwendeten Funktion von GolfScript, die interpolierten Ruby-Code in Strings in doppelten Anführungszeichen ermöglicht. Mit dieser Funktion definieren wir einen neuen Additionsoperator, der genau wie der eingebaute Operator funktioniert
+
, und rufen ihn dann auf.(Ein Grund, warum die Ruby-Interpolationsfunktion in GolfScript so selten verwendet wird, ist, dass der interpolierte Ruby-Code während des Parsens umständlich ausgeführt und seine Ausgabe vom GolfScript-Interpreter zwischengespeichert wird. Wenn Sie also z. B. einen String mit interpoliertem Ruby-Code haben In einer Schleife wird der Code nur einmal ausgeführt, bevor das eigentliche Programm gestartet wird, und anschließend wird bei jeder Iteration der Schleife immer derselbe Wert zurückgegeben. Sie können dies umgehen , indem Sie mit string eval das Parsen verschieben, was die ohnehin unangenehme Syntax jedoch noch weiter verschärft hässlich und wortreich, und für diese Herausforderung habe ich auf jeden Fall den Operator eval deaktiviert .
~
. Es stellt sich jedoch heraus, dass neue integrierte GolfScript-Operatoren definiert werdenquelle
"#{var'_','gpush a+b'.cc2}";_
, die genau wie Ihre funktioniert, außer dass sie einige Bytes kürzer ist.Node.js v8.2.0, geknackt von Dom Hastings
Sie müssen die
logic
Funktion implementieren . Die Eingabe ist das bereitgestellte Argument (von stdin), die Ausgabe ist das, was Ihre Funktion zurückgibt (wird nach stdout ausgegeben).Meine Codekirche codiert die Zahlen aus der Eingabe. Der Rest des Codes ist nur dazu da, Sie einzuschüchtern.
Die Mess-Funktion macht einige Tricks, um eine punktfreie Notation (
a . b == dot (a) (b)
) zu implementieren , die ich hauptsächlich verwende, um. id .
zufälligen Stellen etwas hinzuzufügen , was nichts bewirkt, aber jemanden verwirrt, der nicht mit funktionaler Programmierung vertraut ist.Die Transformation, die auf die Zahlen angewendet wird, bevor ich sie an die
logic
Funktion übergebe, istx+1
undy-1
, was sich zu 0 addiert, also ist es ein weiterer NOP, der der Dunkelheit hinzugefügt werden muss.Die beabsichtigte Lösung war:
quelle
Informiere 7 , geknackt von ppperry
Die Eingabe sollte vom Player als interaktiver Befehl eingegeben werden, z . B.
add 17 to 25
odersum 17 25
. Sie können die genaue Form des Befehls auswählen, der eingegeben werden soll, sofern er zwei Zahlen enthält. Die Summe der Zahlen (z. B.42
) sollte als Antwort auf den Befehl gedruckt werden.Die Herausforderung besteht natürlich darin, dass die gesamte Aktivität "Lesen eines Befehls" durch ein No-Op ersetzt wird. Es gibt wahrscheinlich mehrere Möglichkeiten, um dieses Problem zu lösen, aber es sollte zumindest eine gewisse Kenntnis der Sprache erfordern. Der, den ich mir ausgedacht habe, ist eigentlich ganz einfach, wenn auch ein bisschen unerwartet.
Ich habe meine Lösung in der GNOME Inform 7-IDE, Version 6L38 , unter Ubuntu Linux getestet . Die beabsichtigte Lösung funktioniert sowohl auf dem Glulx- als auch auf dem Z-Computer-Back-End und sollte auch auf anderen neueren Versionen von Inform 7 funktionieren. Beachten Sie, dass (ohne eine geeignete Umgehung) der obige Code den Interpreter zu einer Besetztschleife veranlasst, wenn er versucht, einen Befehl zu lesen. Der Z-Machine-Interpreter reagiert in diesem Fall nicht mehr und kann in der IDE nicht mehr gestoppt werden. Ich empfehle daher, zum Testen Glulx zu verwenden.
quelle
CPython 3 (wieder), geknackt von Sisyphus
Sie können alles tun, was Sie wollen - solange es nicht in C implementiert ist. Das heißt, nein
print
, neininput
- alle treffen die_(1)
Leitung und enden. Eingabe von STDIN mit den Zahlen in zwei separaten Zeilen, Ausgabe an STDOUT. Ich frage mich, wie lange das wohl dauern wird ... Ich habe eine ganze Weile gebraucht, um das zweite funktionierende Snippet zu finden, nachdem ich mir diesen Deaktivierungstrick ausgedacht habe. Explizite Angabe von Cpython, um Cracks zu vermeiden, sofern keine alternative Implementierung von sys.setprofile vorliegt.quelle
functools
?Java 8 ( Gebrochen )
Zweiter Versuch. Dieses Mal habe ich zwei Minuten lang getestet.
Die meisten Dinge shouuuld abgedeckt werden.
quelle
Python 2 geknackt
Probieren Sie es online!
Ich werde dies vorwegnehmen, indem ich sage, dass diese Antwort ein Ruck ist, der als Antwort auf die untere Grenze gedacht ist.
Inspiriert von den Antworten von Wheat Wizard und HyperNeutrino .
Das Snippet liest die Quelldatei und weigert sich, fortzufahren, wenn der letzte durch Leerzeichen getrennte Codeabschnitt nicht in diese Datei eingefügt wird
e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843
.BEARBEITEN : Leicht bearbeitet als Reaktion auf diesen Kommentar . Das Kernproblem ändert sich nicht, jeder Rissversuch wird nicht für ungültig erklärt.
quelle
This code is not allowed to crash or exit.
Java 8 Gebrochen von @ OlivierGrégoire
Ich habe versucht, es so schwer wie möglich zu machen! :) Und anders als bei der bisherigen Java-Antwort müssen Sie die genauen Regeln der Challenge befolgen, indem Sie sie nach diesem gesamten Snippet platzieren (also nein, Sie geben Ihren Code nicht in die
public static void main(String[] args)
Methode ein, sondern Sie geben ihn ein nach dem ganzen unterricht :) Viel glück!Ich habe Kommentare hinzugefügt, um zu zeigen, was eingeschränkt wird.
( Inspiriert von diesem Beitrag, der weniger restriktiv und selig mit dem gleichen Ansatz ist, den ich für meine Antwort verwenden könnte. )
Probieren Sie es hier aus. (ideone.com anstelle von TIO, da es dort nicht zu funktionieren scheint. Die Tests wurden in der Eclipse-IDE durchgeführt, aber meine vorgesehene Lösung funktioniert, wenn Sie ideone.com verwenden.)
quelle
Jelly: Geknackt
Dies wird im Vergleich zu Wheat Wizard's fantastischer Python-Antwort wahnsinnig einfach sein, aber jetzt geht es los: P
Das sha256-Hexdigest meiner Workaround-Lösung, einschließlich des ersten Snippets, ist
cfeb1e193ad77f66f039c0d6a792a3e4c311490f6412698e019ca1fae10c0e0a
.Hinweis
Der Code enthält möglicherweise keine Zeilenumbrüche, außer für Zeichenfolgen. Andernfalls wird dieser Code nicht einmal ausgeführt, was den Zweck dieser Herausforderung zunichte macht.
Von DJMcMayhem geknackt
Um fair zu sein, wird ein Zeilenvorschub verwendet. Daher würde ich gerne eine Lösung sehen, bei der kein Zeilenvorschub verwendet wird.
Auch eine Lösung von Jonathan Allan
Hier wird kein Zeilenumbruch verwendet, daher wurden Risse festgestellt. : P
Meine Lösung lautet:
Das erste Snippet löscht nur einzelne Zeichenatome, was bedeutet, dass Python eval immer noch funktioniert :)))
quelle
JavaScript, geknackt
Eingabe:
prompt()
zweimalAusgabe:
console.log()
Meine Lösung funktioniert nicht in jsfiddle. Funktioniert auf der Seite about: blank mit der JS-Konsole von Google Chrome.
Meine Lösung:
Erläuterung:
Ich habe prompt und console entfernt, indem ich sie auf 0 gesetzt habe.
In meiner Lösung erstelle ich einen Iframe, der eine Sandbox erstellt, und eine neue Instanz eines Fensters, in dem Eingabeaufforderung und Konsole ordnungsgemäß funktionieren.
quelle
Java, geknackt
Dies
solltesehr leicht zu knacken sein.Beabsichtigte Lösung
Probieren Sie es online aus
quelle
java.io
.. Aber Sie haben die beabsichtigte Lösung trotzdem ..