Czy to się zatrzyma? (Rabusie)


46

To wątek złodziei. Wątek gliniarzy jest tutaj .

Twoim wyzwaniem jest złamanie poddaństwa gliniarza poprzez znalezienie danych, które go zatrzymają. Nie musisz dowiedzieć się, dlaczego, lub wszystkie dane, które powodują zatrzymanie, jeśli jest więcej niż jedno lub dane wejściowe, których zamierzał policjant, wystarczy jedno wejście.

Po złamaniu zgłoszenia opublikuj link do niego w komentarzu lub edytuj w poście gliniarza. Możesz także oflagować swoje zgłoszenie w celu zmodyfikowania go w poście gliniarza. Opublikuj również użyte dane wejściowe i link do postu gliniarza w odpowiedzi w tym wątku. Złodziej, który złamie najwięcej zgłoszeń, wygrywa.

Wiele osób może publikować pęknięcia w tym samym zgłoszeniu gliny, o ile są one różne.

(Jeśli SE przekonwertowało duplikat odpowiedzi na komentarz, możesz zagłosować na tę prośbę o funkcję )


Szukasz nieskradzionych zgłoszeń?

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
Czy różne oznaczają różne dane wejściowe (powiedzmy, że wszystkie dane kończące się na 2 łamią słupek gliniarza - czy różni ludzie mogą umieszczać różne liczby kończące się na 2?) Lub różne rodziny danych wejściowych, czy różne typy danych wejściowych?
Stephen

1
Wiele osób może publikować pęknięcia w tym samym zgłoszeniu gliny ... Proszę zdefiniować inaczej .
Dennis

Odpowiedzi:


49

Malbolge, Klamka

Wypróbuj online (Dzięki Dennis !)

Dane wejściowe dla systemu Windows: F_⌠1234567890

Dane wejściowe w systemie Linux przy użyciu ISO-8559-1: F_ô1234567890

Sedno działania programu Malbolge polega na tym, że zależało ono od zachowania interpretera Malbolge, który powoduje nieskończoną pętlę, jeśli napotka dowolną instrukcję, która nie zawiera się w przedziale od 33 do 126. Program został skonstruowany w taki sposób, że dane wejściowe umożliwiają modyfikację pojedyncza instrukcja.

Zmodyfikowałem interpreter, aby zrzucił stan pamięci programu na początku wykonywania, a także wygenerował „znormalizowany” kod źródłowy, który ma postać listy kodów operacyjnych, które będą uruchamiane podczas wykonywania programu. Dzięki tym informacjom można (powoli) stwierdzić, że mimo że program pobierał 13 danych wejściowych, tylko 1 i 3 dane wejściowe miały znaczenie.

Przeglądając znormalizowany zrzut kodu i pamięci (i odrobinę pomocy debuggera) opracowałem:

a = op (wejście 1, 29524)

b = op (wejście 3, a)

c = op (486, b)

d = op (c, 37)

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

e musi wynosić od 33 do 126

Gdzie opjest tak zwane tritwise „op”, które jest opisane w specyfikacji. Korzystając z tych informacji, możesz napisać prosty program, który iteruje możliwe dane wejściowe (od 0 do 255) i znajduje wszystkie rozwiązania spełniające powyższe kryteria. Znalazłem 2219 możliwych rozwiązań, z których niektóre prawdopodobnie nie będą działały (nie można wprowadzić wymaganych znaków). W szczególności powyższe dane wejściowe są oparte na rozwiązaniu:

(Input 1 = 70, Input 3 = 244)


Nie mam przedstawiciela, który skomentował post na glinie. Czy ktoś mógłby to dla mnie zrobić?
KBRON111

4
Witamy w PPCG! Dobra robota! Myślę, że dzięki temu crackowi wkrótce będziesz miał wystarczającą liczbę powtórzeń :)
Stephen

1
Skomentowałem przez. I tak, świetna robota; Spodziewałem się, że Malbolge przetrwa tydzień!
Veedrac

6
Dobra robota! TIO używa UTF-8, ale po zawinięciu go w Bash, twój crack może zostać zweryfikowany. tio.run/… Nawiasem mówiąc , nie potrzebujesz niczego F_ô.
Dennis

1
Teraz mogę znów spać
Juan Tonina


13

JS (ES6), Juan Tonina

+0,-0

Trochę szukałem, Object.isżeby znaleźć. Zasadniczo, +0 === -0ponieważ ===sprawdza je jako liczby i 0jest skończone, ale Object.iswidzi +0i -0jako różne obiekty. Bardzo sprytny policjant :)

Wypróbuj online!


Ninja go dostała, kiedy się logowałem. Strzelaj.
user3033745,

Cholera, rozwiązany szybciej niż czas spędzony na myśleniu o kodzie: 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)

Po prostu redefiniujemy równość, aby zachowywać się dokładnie tak, jak jest to wymagane do zakończenia programu.


Choć przypuszczam, że mogło tak zdefiniowane __eq__, aby raise...
g.rocket

Już miałem się poddać, właśnie wracając 0: p
Jonathan Allan

@JonathanAllan Jak to działa?
g.rocket

1
Jestem pewien, że po prostu class A:__eq__=lambda s,o:0i f(A())działa.
Jonathan Allan

1
Ach tak, potrzebuję negacji> _ <
Jonathan Allan


8

PHP, Syzyf

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

Funkcja parse_str zmienia spacje i inne znaki na podkreślenia. Jeśli wstawisz [używany do ogranicznika Array bez zamykania, zmienia on znak podkreślenia, ale powoduje to, że nie tłumaczy następujących spacji (nie wiem dlaczego).

Wypróbuj online!


WTF ?! To szalone ...
Veedrac


7

JavaScript (ES7), Arnauld

Standard

"8e7" jest rozwiązaniem

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

var key = "8e7"

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

Włamać się

Nie trzeba obliczać tej liczby, możemy ponownie zdefiniować lengthwłaściwość

Ustawia się ~x/x.length**3!=-2962963nafalse

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

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

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

Priorytet operatorów

~ bitowe nie jest pierwsze

** exponentiation druga

/ division trzeci


6

Bash, Veedrac

LD_TRACE_LOADED_OBJECTS

Wypróbuj online!

Z strony ld.so(8)podręcznika:

LD_TRACE_LOADED_OBJECTS

Jeśli jest ustawiony (na dowolną wartość), powoduje, że program wyświetla listę jego dynamicznych zależności, tak jakby działał ldd(1), zamiast normalnie działać.


Myślałem, że to potrwa dłużej! Wspaniała robota.
Veedrac

1
@Veedrac: Wydaje mi się, że skoro podałeś bash, jest mało prawdopodobne, abyś znalazł statycznie link (np. Busybox?) /bin/yes, Ale jest to możliwe, w takim przypadku ta zmienna env zostanie zignorowana.
Peter Cordes

6

Mathematica, JungHwan Min

Unevaluated@Throw@"hammertime"

Nie ma pojęcia, czy jest to zamierzone rozwiązanie, ale przechodzi ono do wyrażenia, które nie jest oceniane, dopóki nie zostanie określone jako #wewnątrz funkcji, co spowoduje, że natychmiast powróci z funkcji bez dokonywania dalszej oceny. Możesz zobaczyć, że funkcja jest faktycznie wywoływana (zamiast po prostu zgłosić wyjątek przed nawet wywołaniem funkcji), zmieniając funkcję na:

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

Które rzeczywiście wydrukują stopprzed zgłoszeniem błędu.


Bingo! (Właściwie to chciałem Unevaluated[Abort[]], ale to samo.)
JungHwan Min


5

Rubin

exit

bez nowej linii. 3.send('exit')na pewno nie jest równy 5, ale wykonuje Kernel#exit:

Inicjuje zakończenie skryptu Ruby, zgłaszając wyjątek SystemExit

Jest to możliwe, aby zadzwonić exitna 3 ponieważ :

Moduł jądra jest zawarty w klasie Object, więc jego metody są dostępne w każdym obiekcie Ruby [jako metody prywatne].

abort działa również:

Natychmiast zakończ działanie, wywołując Kernel.exit (false). Jeśli podano msg, jest ono zapisywane do STDERR przed zakończeniem.


5

JavaScript (Node.js) , programmer5000

Już pęknięty, ale mój jest nieco inny :) Nie mam wystarczającej liczby przedstawicieli, aby komentować w policji. Mogę również edytować, aby naprawić formatowanie, mój pierwszy post tutaj.

Głównie ustawiam __proto__równą funkcji, która rzuca. Zaczerpnięte z patrzenia na stronę Mozilli w poszukiwaniu proto. (Przepraszam, niski przedstawiciel, nie mogę opublikować linku).

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

Wypróbuj online!

EDYCJA: Mam trochę przedstawicieli, więc oto link: Mozilla__proto__


Skomentowałem dla ciebie gliniarza.
Stephen

1
Dzięki! Również dziękuję wszystkim za wzloty, chyba mogę to teraz skomentować!
Haumed Rahmani

1
Witamy w PPCG: D
Conor O'Brien


5

R, Jarko Dubbeldam

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

Przyłącz się po raz pierwszy, więc odrzuć błędy, które popełniłem w formacie.

Jestem pewien, że jest to poprawne. Tylko przepisanie is.list (), prawda?


Nawiasem mówiąc, nie mam przedstawiciela, który mógłby komentować oryginał, więc ręka byłaby mile widziana, gdyby była ważna.
CriminallyVulgar

Skomentowałem dla ciebie.
TheLethalCoder

Nie jest to zamierzone rozwiązanie, ale działa. Dobra robota.
JAD

5

JavaScript, programator 5000

Maksymalna długość łańcucha

Używa łańcucha o długości mniejszej niż to, co obsługuje Twój silnik. Podczas dodawania "h"do tego ciągu zgłaszany jest błąd. Wypróbuj 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());

Blok pochodzenia krzyżowego

Mocno zainspirowany odpowiedzią @ jadkik94 , ale działa wszędzie. Tworzy iframe krzyżowego pochodzenia, a następnie przekazuje .contentWindowwymieniony iframe. Nie udaje się to, gdy funkcja próbuje użyć wartości ze względu na bezpieczeństwo krzyżowe.

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);

Wartość pierwotna

Wariant .toString()odpowiedzi - to po prostu wykorzystuje toPrimitivezamiast tego. Zwraca obiekt jako prymitywną wartość, której JavaScript nie wie, jak sobie z tym poradzić (więc generuje błąd). Wypróbuj online!

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

Dobra robota, ale wciąż nie jest to zamierzone rozwiązanie! Bardzo mądry!
programator5000

4

Node.js, Adnan

{}i {}lub dowolne 2 obiekty są dwoma wejściami. Nawet nie rozumiem, jak to działa.

Oto niesamowita logika porównywania obiektów JS:

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

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


Tak, to było zamierzone rozwiązanie :)
Adnan


4

JavaScript (NIE node.js) , programmer5000

Nie można tego dodać, ponieważ tworzy obiekt, który nie ma funkcji toString, ponieważ nowy Setnie wiąże się z prototypami z Object.

Wejście:

new Set()

Wypróbuj online!


To prawdopodobnie było zamierzone rozwiązanie, odtąd będę to trzymał w głowie: P
Stephen

Przepraszam, że to nie działa dla mnie? Wypróbuj online!
Haumed Rahmani,

@HaumedRahmani dodał przycisk spróbuj online. Użyłem pająka, a nie babla.
Grant Davis,

Nie zamierzone rozwiązanie, ale dobra robota!
programista



4

Python 2, Foon

__import__("os")._exit(0)

Zasadniczo to, co jest napisane na puszce.

Wypróbuj online.


Co ciekawe, w TIO czas mi się wydłużył; pod Windows (konkretnie z Winpty Python inputbad.py i wklejaniem w linii), kończy się zgodnie z oczekiwaniami ... i tak, nic dziwnego, że mój schtict wykorzystał bit „wejście pod Pythonem 2 ewaluuje pod maską”
Foon

@ Foon Hmm, dla mnie działa dobrze w TIO. Zobacz link w odpowiedzi.
Veedrac

Dziwne ... Musiałem uderzyć w grę, a potem napisać na moim linku TIO i nie zdawałem sobie z tego sprawy
Foon,

Jestem prawie pewien, że to łamie każde zgłoszenie do Pythona ..
Enderland

@enderland Tylko jeśli ocenią twój wkład, czego większość z nich nie.
Veedrac


4

Python 3, Siphor

To było fajne. Musimy wykonać type(x) != strsprawdzenie, więc musimy kontrolować wartość zwracaną type(). Musimy przesłonić __class__atrybut i zastąpić go niestandardowym obiektem, który rozszerza się type, a __ne__metoda zastępowana jest metodą, która zawsze zwraca wartość false. To sprawia, że ​​przechodzi sprawdzanie typu, ale wyszukiwanie się nie powiedzie, ponieważ onie jest to str.

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

Witamy na stronie! :)
DJMcMayhem

4

C #, TheLethalCoder

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

Lub jakakolwiek inna zerowalna klasa.



3

JS (ES6)

"   "

Każdy znak o kodzie mniejszym niż 10 powinien działać; Użyłem tabpowyższej postaci, którą SE zamienia na spacje.



Przepraszam :( plus myślę, że potrzebujesz ciągłego cudzysłowu, aby był to ciąg
Stephen

@ programmer5000, więc widzę :(
Shaggy

Nie ma problemu, @StepHen; charakter gry. Zacytowałem cytaty, ale będę je edytować.
Kudłaty,

@Shaggy Nie wiem co to orzeczenie, ale f(<tab>)jest prawidłowa składnia (pusty wejście) i musielibyśmy rozróżniać f(1)i f("1")tak czy owak
Stephen


3

cQuents, Step Hen

Wszystko po czym następuje spacja i dodatnia liczba całkowita. Spacja oddziela dane wejściowe, a dodatkowe dane wejściowe stają się liczbą terminów na dane wyjściowe.

Wypróbuj online!


Właśnie miałem opublikować a 1! Ty ninja'd mnie: /
Pan Xcoder

@ Mr.Xcoder Napisałem to na telefonie komórkowym, mając nadzieję, że nikt mnie nie ninja: P
PurkkaKoodari

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.