Si fermerà? (ladri)


46

Questo è il filo dei ladri. Il thread della polizia è qui .

La tua sfida è quella di infrangere la presentazione di un poliziotto trovando un input che lo fermi. Non devi scoprire perché, o tutti gli input che lo fermano se ce n'è più di uno, o l'input previsto dal poliziotto, solo un input farà.

Dopo aver infranto una richiesta, pubblica un link ad essa in un commento o modifica il messaggio del poliziotto. Puoi anche contrassegnare la tua richiesta per una mod per modificarla nel post del poliziotto. Inoltre, inserisci l'input utilizzato e un link al post del poliziotto in una risposta in questa discussione. Vince il ladro che incrina la maggior parte degli invii.

Più persone possono pubblicare fessurazioni allo stesso invio di poliziotti, a condizione che siano diverse.

(Se SE ha convertito la tua risposta duplicata in un commento, potresti voler votare questa richiesta di funzionalità )


Cerchi invii non crackati?

fetch("https://api.stackexchange.com/2.2/questions/135363/answers?order=desc&sort=activity&site=codegolf&filter=!.Fjs-H6J36vlFcdkRGfButLhYEngU&key=kAc8QIHB*IqJDUFcjEF1KA((&pagesize=100").then(x=>x.json()).then(data=>{var res = data.items.filter(i=>!i.body_markdown.toLowerCase().includes("cracked")).map(x=>{const matched = /^ ?##? ?(?:(?:(?:\[|<a href ?= ?".*?">)([^\]]+)(?:\]|<\/a>)(?:[\(\[][a-z0-9/:\.]+[\]\)])?)|([^, ]+)).*[^\d](\d+) ?\[?(?:(?:byte|block|codel)s?)(?:\](?:\(.+\))?)? ?(?:\(?(?!no[nt][ -]competing)\)?)?/gim.exec(x.body_markdown);if(!matched){return;}return {link: x.link, lang: matched[1] || matched[2], owner: x.owner}}).filter(Boolean).forEach(ans=>{var tr = document.createElement("tr");var add = (lang, link)=>{var td = document.createElement("td");var a = document.createElement("a");a.innerText = lang;a.href = link;td.appendChild(a);tr.appendChild(td);};add(ans.lang, ans.link);add(ans.owner.display_name, ans.owner.link);document.querySelector("tbody").appendChild(tr);});});
<html><body><h1>Uncracked Submissions</h1><table><thead><tr><th>Language</th><th>Author</th></tr></thead><tbody></tbody></table></body></html>


2
Differenti significano input diversi (diciamo, tutti gli input che terminano con 2 violano il post del poliziotto - puoi persone diverse che postano numeri diversi che terminano con 2?) O diverse famiglie di input o tipi diversi di input?
Stephen,

1
Più persone possono pubblicare fessurazioni allo stesso invio di poliziotti ... Si prega di definire diversi .
Dennis,

Risposte:


49

Malbolge, pomello della porta

Provalo online (Grazie Dennis !)

Input per Windows: F_⌠1234567890

Input su sistema basato su Linux usando ISO-8559-1: F_ô1234567890

Il cuore di come ha funzionato il programma Malbolge è che dipendeva da un comportamento dell'interprete Malbolge che provoca un ciclo infinito se incontra qualche istruzione che non è tra 33 e 126. Il programma è stato costruito in modo tale che il tuo input ti consenta di modificare una singola istruzione.

Ho modificato l'interprete per scaricare lo stato della memoria del programma all'inizio dell'esecuzione e per produrre anche un codice sorgente "normalizzato" che assume la forma di un elenco di codici op che verranno eseguiti durante l'esecuzione del programma. Con queste informazioni è possibile (lentamente) determinare che, anche se il programma ha preso 13 ingressi, solo il 1 ° e il 3 ° ingresso erano realmente importanti.

Guardando il codice normalizzato e il dump della memoria (e un tocco di aiuto per il debugger) ho ideato quanto segue:

a = op (input 1, 29524)

b = op (input 3, a)

c = op (486, b)

d = op (c, 37)

e = d / 4 + d% 3 * 3 ^ 9

e deve essere compreso tra 33 e 126

Dov'è opla cosiddetta "op" tritwise che è descritta nelle specifiche. Utilizzando queste informazioni è possibile scrivere un semplice programma che scorre sui possibili input (da 0 a 255) e trova tutte le soluzioni che soddisfano i criteri sopra indicati. Avevo trovato 2219 possibili soluzioni, alcune delle quali probabilmente non funzioneranno (non è possibile inserire i caratteri richiesti). In particolare, gli input di cui sopra si basano sulla soluzione:

(Input 1 = 70, Input 3 = 244)


Non ho il rappresentante per commentare il post sulla polizia. Qualcuno potrebbe farlo per me?
KBRON111,

4
Benvenuti in PPCG! Buon lavoro! Penso che con questa crepa, avrai presto abbastanza rappresentante :)
Stephen,

1
Ho commentato. E sì, ottimo lavoro; Mi aspettavo quasi che Malbolge durasse la settimana!
Veedrac,

6
Bel lavoro! TIO usa UTF-8, ma avvolgendolo in Bash, il tuo crack può ancora essere verificato. tio.run/… Non sembra che tu abbia bisogno di altro che F_ôa proposito.
Dennis,

1
Ora posso dormire di nuovo
Juan Tonina,


13

JS (ES6), Juan Tonina

+0,-0

Ci sono voluti un po ' Object.isper cercare. Fondamentalmente, +0 === -0dal momento che ===li controlla come numeri, ed 0è finito, ma Object.isvede +0e -0come oggetti diversi. Poliziotto molto intelligente :)

Provalo online!


Ninja l'ha capito mentre stavo accedendo. Spara.
user3033745

Dannazione, risolto più velocemente del tempo che ho trascorso pensando al codice: D
Juan Tonina,

11

Python, Siphor

class A:
    i = True
    def __eq__(self, a):
        self.i = not self.i
        return self.i

a = A()
f(a)

Ridefiniamo l'uguaglianza per comportarci esattamente come richiesto per far terminare il programma.


Anche se suppongo che avrei potuto appena definito __eq__per raise...
g.rocket

Stavo per presentarmi con un ritorno 0: p
Jonathan Allan,

@JonathanAllan Come funziona?
g.rocket,

1
Abbastanza sicuro solo class A:__eq__=lambda s,o:0e f(A())fa il lavoro.
Jonathan Allan,

1
Ah sì, ho bisogno della negazione> _ <
Jonathan Allan,


8

PHP, Sisifo

(-0[0)> deal with it=1

La funzione parse_str modifica gli spazi e gli altri caratteri in caratteri di sottolineatura. Se metti un [usato per il delimitatore di array senza chiudere, lo cambia in un carattere di sottolineatura ma ha l'effetto di non tradurre i seguenti spazi (non so perché).

Provalo online!


WTF ?! È folle ...
Veedrac, il

7

JavaScript (Node.js), Adnan

[]e []sembra funzionare. Ho provato un gruppo di loro tra cui null, undefined, NaN...

[] >= [] && [] <= [] && [] != [] valuta vero.

Morale della storia: JavaScript è strano .

Provalo online!


Sì, le matrici sono solo oggetti.
programmatore

E gli oggetti vengono convertiti in stringhe per questi tipi di confronti.
Conor O'Brien,

7

JavaScript (ES7), Arnauld

Standard

"8e7" è la soluzione

var crack_me = (x=0)=>{for(;~x/x.length**3!=-2962963;);}

var key = "8e7"

crack_me(key)
console.log("stopped :)")

Hack

Non è necessario calcolare questo numero, possiamo ridefinire la lengthproprietà

Questo è impostato ~x/x.length**3!=-2962963sufalse

var crack_me = (x=0)=>{for(;~x/x.length**3!=-2962963;);}

var key = {toString:()=>"2962962",length:"1"}

crack_me(key)
console.log("stopped :)")

Priorità degli operatori

~ bit a bit non è il primo

** exponentiation secondo

/ division terzo


6

Bash, Veedrac

LD_TRACE_LOADED_OBJECTS

Provalo online!

Dalla ld.so(8)manpage:

LD_TRACE_LOADED_OBJECTS

Se impostato (su qualsiasi valore), induce il programma a elencare le sue dipendenze dinamiche, come se fosse eseguito da ldd(1), invece di funzionare normalmente.


Pensavo che sarebbe durato di più! Lavoro eccellente.
Veedrac,

1
@Veedrac: suppongo che da quando hai specificato bash, è improbabile che tu possa trovare un collegamento statico (ad esempio, busybox?) /bin/yes, Ma ciò è possibile, nel qual caso questo var verrebbe ignorato.
Peter Cordes,

6

Mathematica, JungHwan Min

Unevaluated@Throw@"hammertime"

Nessun indizio se questa sia la soluzione prevista, ma passa in un'espressione che non viene valutata fino a quando non viene referenziata come #all'interno della funzione, il che le farà tornare immediatamente dalla funzione senza fare ulteriori valutazioni. Puoi vedere che la funzione viene effettivamente chiamata (invece di lanciare l'eccezione prima ancora di invocare la funzione) cambiando la funzione in:

#0[Print@"stop";#;$IterationLimit=∞]&

Che stamperà davvero il stopprima di lanciare l'errore.


Bingo! (In realtà stavo cercando Unevaluated[Abort[]], ma stessa cosa.)
JungHwan Min


5

Rubino

exit

senza newline. 3.send('exit')sicuramente non è uguale a5 , ma esegue Kernel#exit:

Avvia la chiusura dello script Ruby sollevando l'eccezione SystemExit

E 'possibile chiamare exitin 3 causa :

Il modulo Kernel è incluso dalla classe Object, quindi i suoi metodi sono disponibili in ogni oggetto Ruby [come metodi privati].

abort funziona anche:

Termina immediatamente l'esecuzione, efficacemente chiamando Kernel.exit (false). Se viene fornito msg, viene scritto su STDERR prima di terminare.


5

JavaScript (Node.js) , programmer5000

Già incrinato, ma il mio è leggermente diverso :) Non ho abbastanza rappresentante per commentare negli sbirri. Mi sento anche libero di modificare per correggere la formattazione, il mio primo post qui.

Principalmente ho impostato __proto__uguale a una funzione che genera. Tratto da guardare la pagina di Mozilla per proto. (Siamo spiacenti, rappresentante basso, impossibile pubblicare un collegamento.)

x = {}
let No = function () { throw 'halted' }
x.__proto__ = new No()
f = x=>{while(x.__proto__);}

Provalo online!

EDIT: ho qualche rappresentante, quindi ecco il link: Mozilla__proto__


Ho commentato il poliziotto per te.
Stephen,

1
Grazie! Grazie anche a tutti per gli aggiornamenti, immagino di poter commentare ora!
Haumed Rahmani,

1
Benvenuti in PPCG: D
Conor O'Brien,


5

R, Jarko Dubbeldam

function(x)if(is.list(x))return(1)

La prima volta che contribuisci a qualcosa, quindi fai notare tutti gli errori che ho fatto nel formato.

Abbastanza sicuro che questo sia valido. Solo un rewrapping di is.list (), giusto?


Per inciso, non ho il rappresentante per commentare l'originale, quindi una mano sarebbe apprezzata se è valida.
CriminallyVulgar

Commentato per te.
TheLethalCoder

Non è la soluzione prevista, ma funziona. Buon lavoro.
JAD,

5

Javascript, programmatore 5000

Lunghezza massima della stringa

Usa una stringa con una lunghezza inferiore di quella supportata dal tuo motore. Quando si aggiunge "h"a questa stringa, viene generato un errore. Provalo online!

function getAlmostMaxLenStr() {
  var prevBases = [];
  var base = "a";
  try {
    while(true) {
      prevBases.push(base);
      base += base;
    }
  } catch(e) {}
  for (var i = prevBases.length-1; i>=0; --i) {
    try {
      base += prevBases[i];
    } catch (e) {}
  }
  return base;
}
f(getAlmostMaxLenStr());

Blocco di origine incrociata

Fortemente ispirato dalla risposta di @ jadkik94 , ma funziona ovunque. Crea un iframe di origine incrociata, quindi passa il .contentWindowdi detto iframe. Ciò non riesce quando la funzione tenta di utilizzare il valore a causa della sicurezza tra origini.

let f=x=>{
  try {
    console.log(x+"h"); // we don't want to lock up your browser, do we ;)
  } catch (e) { console.log("Halted!\n",e); }
}
let iframe=document.createElement("iframe");
const url = location.host.indexOf("google") === -1 ? "https://google.com" : "https://stackexchange.com";
iframe.src=url;
iframe.onload=a=>f(iframe.contentWindow);
document.body.appendChild(iframe);

Valore primitivo

Variante delle .toString()risposte: utilizza solo questa toPrimitive. Restituisce un oggetto come valore di base, che Javascript non sa come gestire (quindi genera un errore). Provalo online!

f({
  [Symbol.toPrimitive](){return {}}
});

Bel lavoro, ma soluzione ancora non prevista! Molto intelligente!
programmatore 5

4

Node.js, Adnan

{}e {}o qualsiasi 2 oggetti sono i due ingressi. Non capisco nemmeno come funzioni.

Ecco le incredibili logiche di confronto degli oggetti di JS:

console.log({} == {});
console.log({} === {});
console.log({} > {});
console.log({} < {});
console.log(!!{});

console.log({} >= {});
console.log({} <= {});


Sì, quella era la soluzione prevista :)
Adnan,


4

Javascript (NON node.js) , programmer5000

Questo non può essere aggiunto perché crea un oggetto che non ha toString perché un nuovo Setnon ha intrinseci prototipi da Object.

ingresso:

new Set()

Provalo online!


Questa era probabilmente la soluzione voluta, lo terrò nella borsa della mia testa da ora in poi: P
Stephen,

Mi dispiace, questo non sembra funzionare per me? Provalo online!
Haumed Rahmani,

@HaumedRahmani ha aggiunto un pulsante di prova online. Ho usato la scimmia ragno, non la babele.
Grant Davis,

Non è la soluzione prevista, ma un bel lavoro!
programmatore



4

Python 2, Foon

__import__("os")._exit(0)

Cosa dice sulla scatola, in fondo.

Provalo online.


È interessante notare che su TIO questo tempo è scaduto per me; sotto Windows (in particolare con inputpone.py winpty python e incollando nella riga), esce come desiderato ... e sì, non a caso il mio schtict stava sfruttando il bit "input sotto Python 2 che fa scalpore"
Foon

@Foon Hmm, sta funzionando bene su TIO per me. Vedi link in risposta.
Veedrac,

Strano ... Devo aver colpito il gioco e poi digitato input sul mio link TIO e non me ne sono reso conto
Foon

Sono abbastanza sicuro che questo crepa ogni invio di pitone ...
Enderland,

@enderland Solo se valutano il tuo contributo, cosa che molti di loro non fanno.
Veedrac,


4

Python 3, Siphor

È stato divertente. Dobbiamo fare il type(x) != strcheck check, quindi dobbiamo controllare il valore di ritorno di type(). Dobbiamo sovrascrivere l' __class__attributo e sostituirlo con un oggetto personalizzato che si estendetype , che ha il __ne__metodo sostituito da uno che restituisce sempre false. Questo fa passare il controllo del tipo, ma la ricerca fallirà perché onon è una str.

class m(type):
    def __ne__(a,b):
        return False
class c:pass
o=c()
o.__class__=m("",(c,),{})
f(o)

Benvenuti nel sito! :)
DJMcMayhem

4

C #, TheLethalCoder

System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

O qualsiasi altra classe nullable.



3

JS (ES6)

"   "

Qualsiasi carattere con un codice inferiore a 10 dovrebbe funzionare; Ho usato un tabpersonaggio sopra, che SE converte in spazi.



Scusa :( in più penso che avresti bisogno di virgolette per essere una stringa
Stephen

@ programmer5000, quindi vedo :(
Shaggy

Nessun problema, @StepHen; natura del gioco. Ho preso le virgolette per essere implicite, ma le modificherò.
Shaggy

@Shaggy Non so quale sia la sentenza, ma f(<tab>)è una sintassi valida (input vuoto) e dovremmo distinguere tra f(1)e f("1")comunque
Stephen

3

JavaScript (ES6), programmatore 5000

"\0"

Provalo online!

La condizione era !x||x>="\n". Qualsiasi singolo carattere in una tabella ASCII con un codice inferiore a quello \nfunzionerà.


Sì, pensavo che fosse così, non ero sicuro ...
tuskiomi,


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.