Errate mein Passwort (Räuber-Thread)

Oct 23 2020

Inspiriert von dieser Herausforderung, die geschlossen wurde. Dies soll eine einfachere, aber nicht weniger interessante Version davon sein.

Dies ist der Räuberfaden einer Cops-and-Robbers- Herausforderung. Den Cops-Thread finden Sie hier .

Cops werden ein Programm / eine Funktion und ein Flag bereitstellen. Räuber werden ein Passwort erraten. Wenn das Passwort dem Programm des Polizisten gegeben wird, sollte das Flag ausgegeben werden.

Räuberregeln

  • Wenn das Programm des Polizisten das Passwort erhält, das Sie erraten haben, sollte es das Flag ausgeben.
  • Ihr Passwort muss nicht mit dem Passwort des Polizisten übereinstimmen.
  • Sie dürfen mehrdeutige Beschreibungen der Flagge durch Polizisten nutzen.

Cop-Antworten sind sicher, wenn sie zwei Wochen lang nicht geknackt wurden.

Beispiel

Polizist:

Scala, 4 Bytes

x=>x

Flag: Yay, you cracked it!(Ein Objekt vom Typ Stringwird vom obigen Lambda zurückgegeben.)

Probieren Sie es online aus!

Räuber:

Passwort: die Zeichenfolge "Yay, du hast es geknackt!"

Probieren Sie es online aus!

Antworten

19 Benkerd22 Oct 23 2020 at 22:12

Sisyphus, PHP

Passwort:

Eine Zeichenfolge golfmit 1.000.000 führenden Leerzeichen und 1.000.000 nachfolgenden Leerzeichen

Ausgabe: golf

Grund: 1.000.000 ist das Standard-Backtracking-Limit von PCRE (das Sie erhalten können var_dump(ini_get('pcre.backtrack_limit'));). Und preg_matchwird eine FALSEandere als 0 oder 1 zurückgeben, wenn diese Grenze überschritten wird.

Probieren Sie es online aus!

12 ChristianMann Oct 23 2020 at 17:05

ovs, Python 2

Passwort:

class m:0
m.__init__ = hex.__init__
n = 49374
m.__str__ = n.__hex__
class a: __metaclass__ = m

Ausgabe: 0xc0de

Probieren Sie es online aus!

9 Paul Oct 26 2020 at 23:38

R, Robin Ryder

Passwort: as.roman(c(1, 9)))

Es waren römische Ziffern!

Probieren Sie es online aus!

7 ovs Oct 24 2020 at 15:03

Lynn, Haskell

Lynn erstellte eine stapelbasierte Minisprache. Die Aufgabe bestand darin, die Primzahlen bis zu 500 in 60 oder weniger Operationen zu generieren. Hier ist mein Passwort für 55 Operationen:

[0,0,2,1,4,1,0,2,1,1,4,4,4,30,0,2,0,2,0,20,10,0,3,10,2,0,3,1,0,10,3,6,6,6,6,5,4,7,5,0,7,3,10,2,0,3,20,2,1,0,3,0,3,30,2]

Probieren Sie es online aus!

Die verfügbaren Operationen sind

0   push 1
1   duplicate top of stack
2   add top two values
3   subtract
4   multiply
5   integer divide top value by second value
6   push the second value without popping it
7   swap top two values
c>7 while loop, runs until top of stack is 0
    the loops ends at the first instruction >=c

0,0,2,1,4,1,0,2,1,1,4,4,4drückt die Anfangsnummer 500. Der Rest des Codes lässt sich am besten von innen nach außen erklären:

6,6,6,6,5,4,7,5ist ein Teilbarkeitstest. Gegeben kund nals die beiden obersten Werte auf dem Stapel berechnet dies \$\lfloor {\lfloor {n \over k} \rfloor \cdot k \over n}\rfloor\$, Die nur 1 , wenn ist kdividieren n: Online ausprobieren!


1,0,10,3,div test,0,7,3,10,2,0,3 ist ein Primalitätstest oder ein zusammengesetzter Test, da dies wahrheitsgemäße Werte (ungleich Null) für zusammengesetzte Zahlen zurückgibt:

1                  -- duplicate n
 0                 -- push 1 - stack: [1, k=n, n]
                   -- in the next iterations of the loop,
                   -- the top of stack will be the inverted result
                   -- of the divisibility test
  10       10      -- while loop:
                   -- runs until [0, d, n] is on the stack,
                   -- where d is the largest divisor of n <n
    3              --   subtract top value (always 1) from k
     div           --   the divisibility test
        0          --   push 1
         7         --   swap top two values
          3        --   subtract (1 - div test result)  
             2     -- add the top 0 to the last k
              0,3  -- subtract 1
                   -- if the loop ended with [0, 1, n], this is now 0
                   -- otherwise we have a positive number

Probieren Sie es online aus!


0,20,10,0,3,10,2,0,3,comp. test,20,2,1erzeugt die nächste Primzahl weniger als n:

0                        -- push 1. This means the current number is composite
                         -- Even if it isn't, we still want to find a prime <n
 20                      -- while loop. This iterates until the composite tests returns 0
   10   10               --   we have an positive number on the top of the stack ...
     0 3                 --   by subtracting 1 until it is 0, ...
          2              --   and adding this to the last prime candidate ...
                         --   we can get rid of it.
           0 3           --   subtract 1 to get new prime candidate pc
              comp       --   check if pc is composite
                  20     -- end of loop, top of stack is now [0, p], with p prime
                    2    -- add 0+p
                     1   -- duplicate the prime, such that we store the result,
                         -- and can use the value to find the next prime

Probieren Sie es online aus!


30,0,2,0,2,next prime,0,3,0,3,30,2wiederholt dies, bis die Primzahl 2gefunden ist:

30              30  -- while loop
  0 2               --   add 1
     0 2            --   add 1
        np          --   find the prime less than this
          0 3       --   subtract 1
             0 3    --   subtract 1
                    --   if the prime was 2, this is now 0
                    --     and the while loop terminates
                  2 -- add the 0 to the 2 to remove it

Probieren Sie es online aus!

6 pppery Oct 23 2020 at 05:52

R, Robin Ryder

5.099829245500619335478113833945732102551318887107339446461762721i

Probieren Sie es online aus!

5 Bubbler Oct 23 2020 at 13:21

Sisyphus, Gelee

Passwort:

[1.1071487177940904,1.1071487177940904,1.1071487177940904,1.1071487177940904,1.1071487177940904,1.1071487177940904,1.1071487177940904,0.897846510365972]

Probieren Sie es online aus!

Der Code OÆTPbedeutet wörtlich genommen product(math.tan(ord(c)) for c in input). Aber die ord-Funktion in Jelly macht nichts für Zahlen, also können wir das ignorieren. Jetzt besteht das Problem darin, diese sehr spezifische Zahl zu generieren . Ich nahm an, dass ich 2 als Multiplikanden verwenden würde, da das Produkt wahrscheinlich einen Präzisionsverlust aufweist. Die Zahl 1.1071487177940904ist gleich arctan(2)und ich verwende sieben Kopien davon, um das Problem auf den Punkt zu reduzieren, an arctan(x)dem x<2ich bessere Chancen habe, genau das Ergebnis zu erzielen. Schließlich habe ich es berechnet arctan(answer/128)und als letzten Term des Eingabearrays eingefügt, und es hat perfekt funktioniert.

5 w123 Oct 23 2020 at 16:44

att, Wolfram Language (Mathematica)

Passwort:

flag /: Head[flag] = flag

Probieren Sie es online aus!

.

Wir können diese Art von Lösung an jedes Mathematica-Programm anpassen:

a /: _[a] = flag; a

Mit diesem Argument wird jede Funktion zurückgegeben flag.

4 r3mainer Oct 23 2020 at 07:03

Sisyphus, Python3

Sie müssen den Prozessor lediglich länger als 9 Sekunden beschäftigen.

Jeder reguläre Ausdruck, der viel Backtracking erfordert, macht den Parser kaputt. Die einzige wirkliche Schwierigkeit besteht darin, es nicht so stark zu verlangsamen, dass Tio seine 60-Sekunden-Grenze überschreitet.

'b(.*.*.*)*z|baaaaaaay'

Probieren Sie es hier online aus.

4 Sisyphus Oct 23 2020 at 14:02

JavaScript (SpiderMonkey), tsh

Passwort hexdump:

61 61 61 00

(3 agefolgt von einem Null-Byte).

Probieren Sie es online aus!

4 thedefault. Oct 25 2020 at 11:11

Eric Duminil, Ruby

Mein Passwort ist

14127792144400463565475544498208881214759697720904563865426051592050217695592754443713601541725640031x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123456789

Gemäß der Ruby-Dokumentation verwirft to_i alles nach der ersten gefundenen Ganzzahl.

Probieren Sie es online aus!

Alternative Lösung:

9164214512877268290754278122624834497733309914632715416260853069873976599113800182718102190123456789

Ich habe die Semiprime mit cado-nfs berücksichtigt.

Probieren Sie es online aus!

4 r3mainer Oct 26 2020 at 17:58

ZippyMagician, Arn

Passwort: J0e_Biden!

Ich bin sicher, dass dies nicht das Passwort ist, an das ZippyMagician gedacht hat, aber es funktioniert zumindest. Das Flag ist gleich 2 96 und der unkomprimierte Code beginnt mit :*:*, wodurch etwas auf die 4. Potenz angehoben wird. Ich bin nicht sicher, was in der Mitte los ist, aber die letzten paar Bytes von code ( :i0^:i"n) berechnen den Wert von a b , wobei a und b die Indizes der Zeichen 0und nin einer transformierten Version der Eingabe sind. Wenn es sich also um das zweite Zeichen handelt 0, müssen Sie nur die Eingabe anpassen, bis das Zeichen nan der richtigen Stelle ist.

3 wastl Oct 23 2020 at 01:18

HyperNeutrino, Python 3

Passwort: import sys;sys.exit()

Probieren Sie es online aus!

Ausgabe: nichts

Ich bin mir nicht sicher, ob ein Fehler in Ordnung wäre. Es würde nichts an STDOUT ausgeben, nur STDERR.

3 Noodle9 Oct 23 2020 at 01:21

HyperNeutrino, Python 3

Passwort: raise SystemExit

Probieren Sie es online aus!

Ausgabe: nichts

3 ovs Oct 23 2020 at 02:57

ThisIsAQuestion, Python 2.7

True=False
The
Flag

Probieren Sie es online aus!

Ausgabe ist The Flag. LeiderTrue funktioniert die Neuzuweisung in Python 3 nicht mehr.

3 Neil Oct 23 2020 at 05:25

Perl 5 knackt Nahuel Fouilleul

Passwort: "^^@@^^:@@@^"^".,).*||,!'|"

Probieren Sie es online aus!

3 ovs Oct 23 2020 at 22:31

SE - hör auf, die Guten zu feuern,> <>

Ein Passwort ist

5 8a*3+o ab*1+o ab*1-o aa*1+o ab*6+o aa*4+o aa*5+o ab*o aa*3+o 48*o ab*5+o ab*1-o aa*1+o aa*8+o aa*8+o ab*5+o 48*o aa*o aa*1+o aa*8+o aa*5+o aa*1-o aa*5+o ab*1+o ab*7+o ab*5+o 95*1+o 95*1+o 95*1+o;

Probieren Sie es online aus!

Das Programm war i10p. iliest ein Zeichen der Eingabe 1und 0drückt 1und 0und pändert den Wert bei x=1, y=0in das eingegebene Zeichen.

Bei der ersten Eingabe wird das Programm geändert i50p, wodurch beliebige Befehle von der Eingabe ausgeführt werden können.
0-9a-fSchieben Sie ihren hexadezimalen Wert auf den Stapel, *+-arbeiten Sie wie erwartet, geben Sie oeinen Wert als Zeichen aus und ;beenden Sie das Programm.

3 thedefault. Oct 23 2020 at 22:59

SunnyMoon ,! @ # $% ^ & * () _ +

1728

Ich habe den Code gelesen und er schien die Dezimaleingabe zu analysieren, durch 48 zu teilen (nicht anzuhalten, wenn er nicht teilbar ist) und das entsprechende Zeichen dreimal zu drucken.

Probieren Sie es online aus!

3 ovs Oct 23 2020 at 22:58

Kevin Cruijssen, 05AB1E

Das Passwort ist

2
,*xžIž?¶

Das .Eeingebaute Programm scheint den Python-Code zurückzuschieben, wenn er fehlgeschlagen ist. Die erste Eingabe ist nur eine beliebige Zahl für die Schleife. Die zweite Eingabe ist ein umgekehrtes 05AB1E-Programm, um die richtige Ausgabe zu erzeugen:

¶        # push newline character
 ?       # print without trailing newline
  žI     # push 2**31
    žx   # push 2**6 = 64
      *  # multiply these numbers => 2**37 = 137438953472
       , # print this with trailing newline
         # since there was explicit output, implicit is now disabled

Probieren Sie es online aus!


Nach einigen weiteren Experimenten fand ich ein saubereres Passwort:

3
print()
3

Probieren Sie es online aus!

.Ebei "print()"Rückgabe ausgeführt None, umgekehrt ist enoN. Dies wird dann als 05AB1E-Code ausgeführt, der das richtige Ergebnis zu liefern scheint. Ich bin mir nicht sicher, wie, aber es könnte einige Funktionen der hier verwendeten Legacy-Version geben, die ich nicht kenne. Da Python zum Drucken der Zeilenumbruch verwendet wurde, wird der Wert immer noch implizit ausgegeben.

3 pppery Oct 24 2020 at 23:48

Python 3.8 Pre-Release, pxeger

("unittest.mock",("mock","sentinel","pxeger","name"),())

Wahrscheinlich nicht die beabsichtigte Lösung.

Probieren Sie es online aus!

3 Sisyphus Oct 25 2020 at 13:00

Ruby, Dingus 'Antwort

system gets;exit
echo '"""'

Probieren Sie es online aus!

3 thedefault. Oct 25 2020 at 23:57

r3mainer, C.

Es tut mir wirklich leid, aber diese Antwort auf Stack Overflow enthält Code, der elementare Xorshift-Operationen direkt rückgängig macht ... Es hat das Ausführen von Xorshift in umgekehrter Reihenfolge erheblich vereinfacht (ich musste nur Code kopieren, einfügen und 6 Zeilen Python schreiben).

07RtUrVE

Probieren Sie es online aus!

3 tsh Oct 26 2020 at 13:29

JavaScript (V8) von PkmnQ

({toString(){return this.i--;},i:43})

Probieren Sie es online aus!

JavaScript-Variablen wie: ({toString(){return this.i.shift();},i:[1,2,3,4,5]})wären in vielen Cops-and-Robbers- Antworten nützlich .


({valueOf:()=>43,toString:()=>42})

Probieren Sie es online aus!

Es ist seltsam: Während, lassen Sie p=({valueOf:()=>43,toString:()=>42}): ''+pErgebnisse, "43"aber `${p}`Ergebnisse "42"...

3 thedefault. Oct 26 2020 at 23:39

Conor O'Brien, Javascript

^^^Z_][_\\\\\]_\\]]]]]]]]]]]]]]]]]]]]]_\\\]_\\\\\\\]_\\\\\\\\\\\\\\\\\\\\\\\\]b_\\\\\\\\\]aa

Der Code scheint ein zufälliges Labyrinth (Schleifen basieren auf unserer Eingabe, aber ich benutze das nicht) ohne Schleifen zu erzeugen. Wir müssen es (in höchstens 999 Schritten) mit einem Programm in einer stapelbasierten Sprache mit diesen 8 Befehlen lösen:

0, rotate stack: S.push(S.shift())
1, pop twice, compare and push difference: [a,b]=S.splice(-2);F=a==b;S.push(a-b)
2, increment register: M++
3, push register: S.push(M)
4, pop and discard: S.pop();
5, reset register: M=0
6, pop to register: M=S.pop();
7, set answer to ToS and halt: R=S.pop();O=[]
8, pop pop() numbers, and if the last equality comparison was true then
   insert the numbers into the program: n=S.pop();n=S.splice(-n);if(F)O=n.concat(O)

Das Programm erhält seine Eingabe als Länge der Sichtlinien in 4 Richtungen und muss einen oder mehrere Befehle in Basis 4 ausgeben (Ziffern 0 und 3 sind Fehler, 1 ist "nach links drehen" und 2 ist "vorwärts bewegen").

Mein Algorithmus prüft, ob die Sichtlinie links Null ist. Wenn es Null ist, dreht es sich nach rechts (indem es 21 zurückgibt), andernfalls dreht es sich nach links und bewegt sich vorwärts (indem es 9 zurückgibt). Ich hätte jedoch links und rechts völlig verwechseln können.

Unser "Programm" wird aus unserer Eingabe erhalten, indem alle darin enthaltenen Zeichencodes (als Dezimalzahlen) verkettet werden. Neunen werden jedoch verworfen. Also habe ich Zeichen mit Codes von 90 bis 98 verwendet, um auf die Befehle zuzugreifen.

Probieren Sie es online aus!

3 EricDuminil Oct 27 2020 at 04:51

Dingus, Ruby und Dingus, Ruby

Ein Passwort für beide Ruby-Herausforderungen von Dingus lautet:

G=->*x{i=0;i+=1 while x[0][i]!~x[1];x[0][i]};Q=method G[methods,/^[o-q]ri/];C=method G[q=Q[],/[o-r]ut[b-d]/];D=method G[q,/^de/];P=G[q,/^[o-r]\z/];D[P]{|x|};C[34];C[34];C[34];C[10]

Probieren Sie es online aus! & Probieren Sie es online aus!

  • Erhält Zugriff auf, putcindem alle verfügbaren (privaten) Methoden aufgelistet und mit Regexen gefiltert werden.
  • Definiert auch neu p, nichts zu tun.
  • stattdessen wird ein Lambda verwendet def
  • method :method_namemit []wird anstelle von verwendet()
  • .kann nicht verwendet werden, daher sind nur die Methoden für Objectund Kernelverfügbar
  • Da putcverfügbar ist, kann eine beliebige Zeichenfolge geschrieben werden.

FORTRAN-ähnlicher Code:

GREP = lambda do |l,r|
  i=0
  while l[i]!~r do
    i+=1
  end
  l[i]
end
PRIVATE_METHODs=method GREP[methods,/^[o-q]ri/]
PUTC=method GREP[PRIVATE_METHODs[],/[o-r]ut[b-d]/]
DEFINE_METHOD=method GREP[PRIVATE_METHODs[],/^de/]
P=GREP[PRIVATE_METHODs[],/^[o-r]\z/]
DEFINE_METHOD[P]{|x|}
PUTC[34]
PUTC[34]
PUTC[34]
PUTC[10]

Probieren Sie es online aus!

3 Giuseppe Oct 27 2020 at 21:57

R , Robin Ryder

function(x,y,z){if(length(ls(1))>1|length(ls())!=3)return("S");LETTERS[lengths(lapply(y,intToUtf8(x),z))*lengths(lapply(y,intToUtf8(x+32),z))]}

Probieren Sie es online aus!

Das Passwort ist ziemlich unsicher : 94,(numeric vector of length 1),(numeric vector of length 6). Insbesondere habe 94,1,1:6ich das benutzt.

Das erste , was ich tat , war zur Kenntnis , dass die lengthszu multiplizieren 18, so dass wir zwei Listen so generieren müssen , dass die lengthssind gleich 1,18, 2,9oder 3,6.

Als nächstes notierte ich intToUtf8(x)und intToUtf8(x+32)fand alle Funktionspaare, die diese Bedingung mit diesem Skript erfüllen . Ich habe sicher ausgeschlossen nrowund ncolda sie die gleichen Werte erzeugen würden, lengthsmüssen die unterschiedlich sein.

Danach ging es nur noch darum, Dinge auszuprobieren; lapplyGibt immer a listmit einer Länge zurück, die der Länge seines ersten Arguments entspricht, ymusste also von Länge sein 1. Zum Glück recycelt R also lapply(1,"^",1:6)==list(1^(1:6)), was lengthsgleich ist 6.

Schließlich ~wird die formulaBuilder sehr ungerade ist, x ~ yist eine formulamit einer Länge 3, mit drei Elementen, '~'(), x(), und y(), so lapply(1,"~",1:6ist der gleiche wie 1 ~ 1:6der auch Länge ist 3.

2 user Oct 23 2020 at 04:17

JavaScript (V8) , Risse Scott ‚s Antwort

Passwort: {length:"0"}

Probieren Sie es online aus!

2 ovs Oct 24 2020 at 04:11

Aryan Beezadhur, JavaScript

Das Passwort lautet defined.

Mit dieser Reverseengineering.SE-Antwort konnte ich den JSFuck wieder in normales JavaScript dekodieren:

if (prompt('Password') === ([0][1]+"").slice(2,9)) alert('cracked!')

Das Passwort muss gleich sein ([0][1]+"").slice(2,9)), was ausgewertet wird "defined".

2 pxeger Oct 25 2020 at 00:56

ovs, Python 3

Passwort: "".format

Probieren Sie es online aus!

2 r3mainer Oct 26 2020 at 15:20

tsh, Javascript (SpiderMonkey)

Passwort: -0

Ausgabe: true

2 pppery Oct 28 2020 at 22:35

R, Paul

data.frame(a = 1, b = 0/0)

Probieren Sie es online aus!