Zainspirowany tym komentarzem ...
Dziękujemy użytkownikom Step Hen , Wheat-Wizard i Dennis za pomoc w ugruntowaniu specyfikacji tego wyzwania przed jego opublikowaniem!
To jest wątek gliniarzy. Przejdź do wątku Rabusiów tutaj
W tym wyzwaniu masz za zadanie uruchomić kod, który sprawi, że Twój język nie będzie spełniał naszych kryteriów bycia językiem programowania. W tym wyzwaniu oznacza to, że język nie może już ...
Weź numeryczne dane wejściowe i wyjściowe
Dodaj dwie liczby razem
Sprawdź, czy określona liczba jest liczbą pierwszą, czy nie.
Jest to wyzwanie dla gliniarzy i złodziei , w którym istnieją dwa różne wyzwania o dwóch różnych celach: gliniarze spróbują napisać kod, który sprawi, że język będzie w większości bezużyteczny, a złodzieje spróbują znaleźć ukryte obejście, które pozwala glinom odzyskać swój język.
Jako policjant musisz napisać dwa fragmenty kodu:
Taki, który sprawia, że twój język jest w większości bezużyteczny, np. Poprzez usunięcie wbudowanych funkcji do pobierania danych wejściowych / wyjściowych i operacji numerycznych. Im więcej funkcji usuniesz, tym lepiej. Ten kod nie może ulec awarii ani wyjść. Powinno być możliwe dodanie kodu na końcu tego fragmentu, a ten kod zostanie poddany ocenie . I...
... fragment kodu, który przyjmuje dwie nieujemne liczby całkowite jako dane wejściowe, dodaje je do siebie i generuje ich sumę. Ten fragment kodu musi nadal poprawnie działać, nawet po uruchomieniu pierwszego fragmentu kodu. Gdy oba fragmenty zostaną połączone razem, muszą one utworzyć pełny program, który dodaje dwie liczby lub zdefiniować funkcję, która dodaje dwie liczby. W idealnym przypadku ten fragment kodu powinien polegać na bardzo niejasnym zachowaniu, aby był trudniejszy do znalezienia.
Możesz wybrać dowolną standardową metodę wejścia i wyjścia . Musisz jednak ujawnić dokładnie, jakiego formatu (wejścia i wyjścia) używasz. Rabuś nie może złamać twojej odpowiedzi, chyba że użyje tego samego formatu co ty.
Po napisaniu obu tych fragmentów musisz opublikować pierwszy jako odpowiedź, nie ujawniając drugiego. Twoja odpowiedź powinna zawierać wszystkie następujące informacje:
Pierwszy fragment (oczywiście nie sekundę).
Język (w tym niewielka wersja, ponieważ większość zgłoszeń prawdopodobnie będzie polegać na dziwnych przypadkowych przypadkach)
Format IO, w tym czy jest to funkcja czy pełny program. Rabusie muszą używać tego samego formatu, aby ich crack mógł być ważny.
Wszelkie dziwne przypadki krawędzi wymagane do odpowiedzi. Na przykład działa tylko na systemie Linux lub wymaga połączenia z Internetem . Oczywiście jest to nieco subiektywne, ale jeśli policjant ma jakiś skrajny przypadek, który zapobiega jego pękaniu, a następnie ujawnia to dopiero po bezpieczeństwie, uważam to za słabe sportowe. Potencjalny złodziej powinien mieć wszystkie informacje niezbędne do złamania odpowiedzi, zanim zostanie ona złamana.
Nie musisz ujawniać liczby bajtów, dopóki odpowiedź nie będzie bezpieczna.
Oto przykład. W przypadku pierwszego fragmentu kodu możesz przesłać następujący program w języku Python 3:
Python 3
print=None
Pobiera dane wejściowe ze STDIN i dane wyjściowe do STDOUT
A jako drugi fragment możesz napisać:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Jest to ważne, ponieważ weźmie dwie liczby jako dane wejściowe i wyświetli ich sumę, nawet jeśli połączysz oba fragmenty razem, np.
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Jednak złodziejowi będzie bardzo łatwo znaleźć rozwiązanie. Ponieważ byłoby to bardzo łatwe do złamania, możesz spróbować załatać to konkretne podejście w następujący sposób:
import sys
sys.stdout=None
print=None
Jednak nawet to ma bardzo łatwe obejście:
del print
a,b=int(input()),int(input())
print(a+b)
Jako policjant Twoim celem jest uczynienie ukrytego obejścia tak niejasnym, jak to możliwe, aby uniemożliwić złodziejom znalezienie go.
W rabusie będą patrzeć na jednej z odpowiedzi, i próbować go złamać. Mogą go złamać, pisząc dowolny prawidłowy fragment, który mógłby działać jako fragment 2 (dodanie dwóch liczb razem po tym, jak język stał się w większości bezużyteczny). To nie musi być ten sam fragment, jak pierwotnie zamierzałeś. Jeśli złodziej złamie twoją odpowiedź, pozostawi komentarz do twojej odpowiedzi, a następnie powinieneś ją edytować, aby wskazać, że została złamana. Jeśli Twój post jest pęknięty, edytuj swoją odpowiedź, aby pokazać rozwiązanie (fragment 2), które pierwotnie zamierzałeś. Nie jest to reguła sama w sobie , tylko przyjazna sugestia, aby gra była przyjemna. Nie musisz.
Jeśli przez cały tydzień odpowiedź pozostanie nieprzetarta, możesz edytować w drugim fragmencie i wskazać, że Twoja odpowiedź jest teraz bezpieczna . Jeśli nie edytujesz go po upływie tygodnia, inni użytkownicy mogą go złamać, dopóki tego nie zrobisz. Jeśli nie ujawnisz swojego drugiego fragmentu, nie możesz zdobyć punktów za odpowiedź lub nazwać go bezpiecznym.
Zwycięzca wątku gliniarzy jest najkrótszą bezpieczną odpowiedzią obejmującą oba fragmenty , liczone w bajtach, i ta odpowiedź zostanie zaakceptowana po upływie wystarczającego czasu. Zdajesz nie musisz ujawniać swój licznik bajtów aż twoja odpowiedź jest bezpieczne, ponieważ liczba bajtów ma znaczenia swój wynik aż twoja odpowiedź jest bezpieczny. W przypadku, gdy upłynie wystarczający czas i żadne odpowiedzi nie pozostaną bez krakowania, zwycięzcą zostanie odpowiedź, która pozostanie bez krakowania przez najdłuższy okres czasu.
Baw się dobrze!
Wyjaśnienia zasad
Pierwszy fragment kodu musi działać poprawnie bez żadnych danych wejściowych . Może wyświetlać cokolwiek zechcesz, a dane wyjściowe będą ignorowane - tak długo jak snippet zostanie zrobiony, drugi fragment działa poprawnie.
Drugi fragment musi zostać faktycznie wykonany, aby odpowiedź była poprawna. Oznacza to odpowiedź typu
import sys sys.exit()
nie jest poprawny, ponieważ nie łamie języka. Po prostu odchodzi. Podobnie, wprowadzenie nieskończonej pętli jest nieprawidłowe, ponieważ drugi fragment kodu nigdy nie zostanie wykonany.
Po zapewnieniu bezpieczeństwa twój wynik jest liczbą bajtów obu fragmentów .
Wróćmy do Proszę ujawnić wszelkie dziwne przypadki brzegowe wymagane do odpowiedzi na twoje pytanie ... Twoje zgłoszenie musi zawierać wystarczającą ilość informacji, zanim zostanie ujawnione, aby było odtwarzalne po ujawnieniu. Oznacza to, że jeśli Twoja odpowiedź stanie się bezpieczna, a następnie edytujesz: Oto moja odpowiedź. O tak, BTW to działa tylko wtedy, gdy uruchomisz go na Solarisie, żart jest z ciebie! Twoja odpowiedź jest nieprawidłowa i zostanie usunięta i nie zostanie uznana za kwalifikującą się do wygrania.
Drugi fragment kodu może ulec awarii po wypisaniu sumy - dopóki dane wyjściowe są nadal poprawne (na przykład, jeśli zdecydujesz się wyprowadzić dane do STDERR, a następnie otrzymasz kilka informacji o awarii, jest to nieprawidłowe).
Nie możesz edytować swojego kodu po przesłaniu odpowiedzi.
Nie możesz polegać na funkcjach kryptograficznych, takich jak szyfrowanie, funkcje skrótu, CSPRNG itp.
Urywek, aby znaleźć nieskradzione zgłoszenia:
źródło
int main(){ do_evil_stuff(); }
gdzie powinien iść kod użytkownika? W funkcji? Po wszystkich oświadczeniach wmain
?Odpowiedzi:
Gforth 0.7.3 (TIO) , 231 bajtów [BEZPIECZNY]
Ten kod redefiniuje jako bezużyteczne niektóre niezbędne metody wyjściowe, a także dodawanie i coś kluczowego dla deklarowania funkcji. Powodzenia!
Wejściami będą dwie podpisane liczby całkowite pobrane z góry stosu jako parametry funkcji. Wyjście do STDOUT.
Powinieneś więc naprawić zadane obrażenia i zdefiniować funkcję, która pobiera dwie najwyższe wartości ze stosu i wypisuje wynik jako liczbę całkowitą (nie zmiennoprzecinkową) do STDOUT bez dodatkowego wyjścia (brak spacji końcowej).
Oto szablon , jeśli twoja funkcja celu ma nazwę
f
.Rozwiązanie:
źródło
Haskell, złamany przez Christiana Sieversa
Pełny program, odczytywanie dwóch liczb całkowitych (w tym ujemnych) ze standardowego wejścia i pisanie na standardowe wyjście.
Właśnie wyłączyłem Preludium, więc prawie nic nie wchodzi w zakres, a potem dodałem definicję; dalsze importy są niepoprawne pod względem składniowym. Dałem ci
getLine
iprint
chociaż.Edytowano, aby dodać moje oryginalne rozwiązanie. Crack Christiana był inny, ale wykorzystuje te same podstawowe funkcje (można uzyskać zaskakującą ilość obliczeń, uzyskując dostęp do funkcji, które mają cukier syntaktyczny, nawet jeśli nie można wywołać bezpośrednio żadnego wbudowanego elementu ani nawet nazwać zaangażowanych typów).
Co i tak prawdopodobnie nie jest super-golfem, ale tutaj jest bardziej czytelne:
źródło
Python 2 , Cracked
Implementuje dodawanie jako nazwaną funkcję
Wypróbuj online!
Co to robi?
Aby ci pomóc, wyjaśnię, co to robi. Ten kod otwiera plik źródłowy i sprawdza, czy pozostała część kodu spełnia następujące kryteria:
import
&)(,.:[]a`cdfijmonrt~
Jeśli nie spełni którekolwiek z kryteriów, limit rekurencji zostanie ustawiony tak,
1
że każdy napisany kod osiągnie limit rekurencji.Nie ma tu żadnych sztuczek, napisałem rozwiązanie, które używa tylko tych znaków i nie importuje, nie robię nic wywrotowego, ale powiem, że myślę, że będzie to dość trudne do złamania.
Aby zaoszczędzić trochę czasu, oto krótka lista przydatnych rzeczy, których nie możesz zrobić z tym ograniczeniem
+
no cóż,eval
/exec
Nie pozwoliłbym ci tego uciecLiczby, mogą być bardziej przydatne niż myślisz
Literały łańcuchowe
len
=
, Brak przypisywania zmiennych>
,<
,==
. . . Nie zostawiłem cię bez porównań*
,-
,/
,%
,^
,|
,>>
,<<
Jedyne operatory dostępne są~
i&
__foo__
, Żadna z tych fantazyjnych metod podwójnego podkreślenia nie jest dozwolona.źródło
This code is not allowed to crash or exit.
(patrz czat w celu dyskusji na jego temat)Python 2 , Cracked
To czwarta iteracja tej odpowiedzi. Każda z ostatnich odpowiedzi została złamana poprzez zresetowanie głębokości rekurencji.
Implementuje dodawanie jako nazwaną funkcję
Wypróbuj online!
Co to robi?
Aby ci pomóc, wyjaśnię, co to robi. Ten kod otwiera plik źródłowy i sprawdza, czy pozostała część kodu składa się wyłącznie ze znaków
&)(,.:[]a`cdfijmonrt~
Jeśli się nie powiedzie, limit rekurencji jest ustawiony tak,
1
że każdy napisany kod osiągnie limit rekurencji.Wyłączyłem również wszystkie moduły, więc nie możesz niczego importować.
Nie ma tu żadnych sztuczek, napisałem rozwiązanie, które używa tylko tych znaków i nie importuje, nie robię nic wywrotowego, ale powiem, że myślę, że będzie to dość trudne do złamania.
Aby zaoszczędzić trochę czasu, oto krótka lista przydatnych rzeczy, których nie możesz zrobić z tym ograniczeniem
+
no cóż,eval
/exec
Nie pozwoliłbym ci tego uciecLiczby, mogą być bardziej przydatne niż myślisz
Literały łańcuchowe
len
=
, Brak przypisywania zmiennych>
,<
,==
. . . Nie zostawiłem cię bez porównań*
,-
,/
,%
,^
,|
,>>
,<<
Jedyne operatory dostępne są~
i&
__foo__
, Żadna z tych fantazyjnych metod podwójnego podkreślenia nie jest dozwolona.Moje rozwiązanie
Teraz, gdy xnor złamał go w sposób, z którego jestem wystarczająco zadowolony, ujawnię swoje rozwiązanie
Niespodzianka, niespodzianka to ogromna kupa bełkotu. Zamiast tego zepsuć, zamierzam przejść przez proces, w jaki sposób to zrobiłem.
Zacząłem od całkiem standardowego algorytmu dodawania
Następnie użyłem bitowe trik do reprezentowania
^
z|
,&
,~
.Użyłem innej bitowej sztuczki, aby się pozbyć
|
Teraz pozostało tylko
<<
, nie powinno być zbyt trudne, prawda? Przygotuj się na wyboistą jazdę. Aby zastąpić przesunięcie bitów, użyłem ciągów, aby dodać zero na końcu jego reprezentacji binarnejMa to kilka problemów, ale podstawowy korzysta z dodawania , więc obejrzałem to, używając zamiast tego formatu
Nie wolno nam używać bin, więc użyłem formatowania ciągów do konwersji na binarną.
Ponieważ dosłowne ciągi znaków są zabronione, muszę zbudować ciąg
{0:b}0
z części wykonanych za pomocą tyknięć ijoin
razem.Pusty ciąg jest dość łatwy, możesz po prostu zrobić
Zera były
i
{:}
wszystkie zostały zabrane ze słowników.b
wydaje się dość trudne, nie ma go w naszym zestawie znaków, więc jak mamy uzyskać obiekt, który mab
w sobierepr
? Oto, jak: Kiedy używaszrepr
wbudowanej funkcji, dostajesz coś, co wyglądaI skąd weźmiemy nasze
b
.Teraz pozostały tylko liczby, potrzebuję tylko -1, 0, 1 i 2, więc oto jak je przedstawiłem:
2 może być o bajt krótszy niż
w oparciu o sugestie @ Blender w komentarzach, ale nie pomyślałem o tym aż po fakcie.
Więc podstawiamy te liczby w
I to jest crack.
źródło
C (gcc) Cracked!
Wypróbuj online!
Wejście ze STDIN i wyjście do STDOUT.
Działa to bezbłędnie. Hahaha, to jest całkiem złe. Testowałem to tylko na gcc TIO. Zazwyczaj musisz dodać swój kod po tym fragmencie, aby zadziałał :) Komentarz jest złośliwy, nie słuchaj go.
Testowane na
gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
. Powinien działać na każdym systemie Linux.Oryginalne rozwiązanie
źródło
__asm__
i masz mnóstwo funkcji do wyboru :) nie myśl, że C i C ++ są tutaj dobrymi wrogami.Haskell , złamany przez Bena
Wypróbuj online! Powinien to być pełny program odczytujący dwie liczby ze standardowego wyjścia i wysyłający sumę do standardowego wyjścia.
Każdy pełny program zaczyna się od uruchomienia
main
funkcji, ale tutajmain
wywołuje się i powoduje nieskończoną pętlę. Co gorsza, komentarz liniowy rozpoczyna się--
bezpośrednio za wywołaniem rekurencyjnym, aby zapobiec zmianie go na np.main2
A następnie zdefiniowaniu, aby wykonać sumowanie.Zamierzone rozwiązanie:
Wypróbuj online!
--
rozpoczyna komentarz linii, chyba że można go również przeanalizować jako część operatora. (Podświetlanie składni wydaje się być nieświadome tego faktu.)--$
Jest poprawnym operatorem poprawki, który przyjmujemain
jako pierwszy argument i jakiś fałszywy drugi argument()
. Następnie definiuje się, aby zignorować oba argumenty i zamiast tego wykonać wymagane zadanie.źródło
C (GCC w systemie Linux) (pęknięty)
Zamiast głupich technik odczytu plików, robimy to we właściwy sposób - z białą listą SECCOMP!
Twoje zadanie: zaimplementuj dodawanie z wejściem STDIN i wyjściem do STDOUT.
Wypróbuj online!
Co to do cholery jest!?
Aby pomóc ci w twoim niezwyciężonym zadaniu, wyjaśnię, co robi ten kod.
__attribute__ ((constructor(0)))
zapewnia, żes
funkcja zostanie uruchomiona jako pierwsza. Funkcja zamyka wszystkie otwarte deskryptory plików dla STDIN, STDOUT i STDERR. Następnie program ogranicza się do ścisłej białej listy SECCOMP, która ogranicza wywołania systemowe do:Dlatego nie możesz otwierać żadnych nowych plików (ani w zasadzie nic robić). Następnie przechodzimy do main i wywołujemy Twój kod, ładnie zawinięty w
sandbox
funkcję.Na
syscall(SYS_exit, EXIT_SUCCESS);
końcu jest po prostu zapewnienie, że programexit_group(2)
zamknie się poprawnie - domyślnie GCC zakończy działanie, z którym nie jest dozwolona biała lista SECCOMP. Ta funkcja wyjścia jest wywoływana po uruchomieniu kodu.Więc nie masz otwartych deskryptorów plików i nie możesz otworzyć niczego nowego. Niemożliwe, prawda? ;)
źródło
16-bitowy tryb rzeczywisty x86, montaż ( pęknięty )
Łatwo, jeśli znasz sztuczkę.
źródło
or [bp], 256
to jest nieprawidłowy. Czy to takor WORD PTR [bp], 256
?)hlt
instrukcji (pierścień 0) zdecydowanie sugeruje, że nie jest to tryb chroniony.Your submission must contain enough information before being revealed to be reproducible after being revealed
JavaScript, pęknięty
Wyzwanie to opiera się na rozwiązaniu Granta Davisa , ale naprawia rozwiązanie, które miał na myśli (które tworzy iframe i korzysta z iframe
window
). Rozwiązanie działa w konsoli javascript na chromeabout:blank page
i zajmuje dwainput()
s, dodaje je do siebie iconsole.log
jest wynikiem. Wpisz swój kod po:Po pierwsze, sprać
prompt
iconsole
oraz ustawić skrótd
. Następnie tworzymy obserwatora mutacji z wywołaniem zwrotnym, który usuwa każdy zmutowany cel. Stawiamy, że mutacja obserwator obserwować dokument, a następnie powiadomić ochildList
isubtree
modyfikacje. Zamiast literałutrue
używamy skrótu do prawdziwej wartościdocument
( specyfikacja na to nie pozwala, ale chrome to robi).Po tym, jak to opublikowałem, zdałem sobie sprawę z dużo bardziej eleganckiego clobbera. Moje zamierzone rozwiązanie nadal działa, ale opublikowany crack nie:
źródło
Perl 5, złamany przez Ilmari Karonen
Dane wejściowe są odbierane w osobnych wierszach,
STDIN
a dane wyjściowe są drukowaneSTDOUT
.Cały kod podąża za
__DATA__
znacznikiem. Wykorzystuje metodę podobną do rozwiązania @ WheatWizard, polegającą na tym, że kod jest analizowany, a niepotrzebne znaki są usuwane.Zostało to przetestowane na wersjach 5.8, 5.10 i 5.16 i nie wymaga żadnych flag wiersza poleceń.
Wypróbuj online!
źródło
STDIN
znaki z osobnymi wierszami iSTDOUT
. Dodam to do głównego ciała.Python 3, cracked przez zbw
Wszystkie moduły zostały usunięte, co oznacza, że nie ma żadnych wbudowanych funkcji i niewiele można zrobić. Wyjście do STDOUT, wejście z STDIN. Jest to druga iteracja tej odpowiedzi po tym, jak poprzednia została złamana przez trywialne crack przez dodanie instrukcji break.
źródło
APL (ngn-apl) , pęknięty przez ngn
Wykonane we współpracy z moim kolegą Marshallem .
Wprowadź za pomocą lewego i prawego argumentu do
+
. Tj. Twoim celem jest wstawienie kodu po poniższym, aby ostatni wiersz odczytywał⎕←3+2
i5
wysyłał dane do STDOUT.Wypróbuj online!
Działa poprzez ustawienie wszystkich przydatnych funkcji, do
{}
których pobiera jeden lub dwa argumenty i zwraca pustą listę liczbową. Ustawia także⍣
po prostu komponować funkcje.Pęknięcie
⍺⍵1/0
powtórz 0 przez lewy argument i prawy argument i 1⍋
pobierz indeksy, które by to posortowały (ponieważ wszystkie elementy są zerowe, daje 0 1 2… (a + b)⌈/
maksymalna wartość (a + b)źródło
+
przy użyciu tylko czystej APL i bez brudnych sztuczek.Python 2 , Cracked
To druga iteracja odpowiedzi, która została raz złamana przez @HyperNuetrino przy użyciu metody, której się nie spodziewałem. Teraz załatałem to, więc mam nadzieję, że jedyne pozostałe rozwiązania będą musiały przestrzegać ograniczeń, które zamierzałem.
Implementuje dodawanie jako nazwaną funkcję
Wypróbuj online!
źródło
u
, ale utknąłem bez tego.u
?.count
. Mogę uzyskać ciąg tak długo, jak żądany wynik, ale nie mam możliwości, aby wziąć jego długość.__import__('sys').setrecursionlimit(100)
... i nic nie zostało załatane. Jednak tak naprawdę nie mam ochoty umieszczać go w wątku rabusia, mam ochotę oszukiwać. Wypróbuj onlineJava 8, Cracked przez @ OlivierGrégoire
Oto moja próba. W zasadzie chodzi o to, aby po prostu przeciążyć wszystkie przestrzenie nazw, których możesz użyć do wyjścia (i mam nadzieję, że odzwierciedlę). Wyjście jest przeznaczone do sdout (System.out).
Czarna lista jest zwykle gorszym podejściem niż biała lista, więc jestem pewien, że to kwestia czasu, zanim ktoś zaproponuje podejście, którego nie rozważałem.
źródło
class String{}
po testach, nie zdając sobie sprawy, że to znokautujemain(String[] ...)
. Powinno już działaćint 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, złamane przez Mayube
To powinno być dość łatwe, ale nigdy nie wiadomo.
„Problem” polegał na tym, że bez
C
kodu wystąpił błąd.Rozwiązanie Mayube:
Każdy element w sekwencji to pierwsze wejście plus drugie razy trzecie (aka 1)
Moje rozwiązania:
Sekwencja przełącza się między pierwszym wejściem plus drugim wejściem, a trzecim wejściem (1). Pierwszy element w drugim to
A+B
.Podobne do rozwiązania Mayube - zamiast pomnożyć
B*C
, po prostu dodaje,C
a następnie odejmuje.Wypróbuj online!
Wyjaśnienie
Obecnie program ten generuje dane wyjściowe
1
, ponieważ bez danych wejściowych użytkownika pierwsze dane wejściowe są pierwsze1
w domyślnej wartości wejściowej (#
).źródło
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
w kodzie. Na przykład, jeśli w dowolnym momencie masz zmiennąD
w swoim programie, analizator oczekuje, że będą 4 dane wejściowe, ale jeśli istniejeE
, analizator oczekuje, że będzie 5 danych wejściowych. Nie może być mniejsza niż oczekiwana kwota. Jednak zawsze jest opcjonalne ostatnie wejścien
, które jest używane na różne sposoby w różnych trybach.A
, więc szuka jednego wejścia. Ponieważ są dwa, z#
których oba pochodzą z domyślnego wejścia, używa pierwszego jakoA
wartości, a drugi jakon
.BC
, A byłoby pierwszym wejściem, B byłoby drugim, C byłoby 1, a n byłoby drugim 1?#1,1
(bez paska), byłby to: A jako pierwszy 1, B jako drugi 1, C jako pierwszy sygnał wejściowy, a n jako drugi sygnał wejściowy. Możesz także zrobić#1|1
, gdzie A to pierwsze 1, B to pierwsze wejście, C to drugie wejście, a n to drugie 1.Node.JS wersja 7.3.0 (Cracked przez Dom Hastings)
Umieść drugi blok kodu po pierwszym.
Oświadczenie: drugi blok kodu nie będzie działał samodzielnie (bez umieszczania go po pierwszym). Jeśli nie jest to dozwolone, mogę zmodyfikować drugi fragment kodu.
To jest pełny program. Wyjście to
process.stdout
(STDOUT), wejście toprocess.argv
(argumenty wiersza poleceń)To moi pierwsi gliniarze i rabusie, mam nadzieję, że to dobre wyzwanie :)
Wypróbuj online!
Wyzwanie wyjaśnione
Generuje losową zmienną
n
od 0 do 1e7. Jeśli zadzwonisz do zapisu z prawidłowymn
, nie drukuje niczego, ale ustawial
na 0, co „odblokowuje” funkcję zapisu, umożliwiając wydrukowanie czegokolwiek. Jeśli spróbujesz wywołać write z nie-ciągiem, wyśle cię do nieskończonej pętli. Jeśli spróbujesz zadzwonić, napisz z czymkolwiek innym niż poprawnyn
gdy zapis jest „zablokowany”, wyśle cię do nieskończonej pętli, aby zapobiec zgadywaniu.Zamierzone rozwiązanie
Przekracza obok typu, który pozornie sprawdza ciągi znaków tylko za pomocą symbolu, który również zaczyna się od s. Powoduje to błąd funkcji wynikający z wywołania eval, ponieważ nie można dodać ciągu „f” do symbolu. Łapiemy błąd i używamy wyrażenia regularnego, aby odzyskać dane
n
ze stosu, gdzie jest on w nazwie funkcji. Następnie próbujemy pisać,n
który niczego nie drukuje, ale ustawia zmienną „lock”l
na 0, aby „odblokować” funkcję zapisu. Teraz, gdy funkcja zapisu jest odblokowana, po prostu drukujemy sumę.źródło
RProgN2 , Pęknięty przez Arnolda Palmera
Zapisuje wszystkie operatory matematyczne, bez możliwości ich przywrócenia. W szczególności zastępuje je funkcją, która usuwa dwa górne elementy ze stosu.
Wypróbuj online!
Oryginalne rozwiązanie
Wypróbuj online!
źródło
²
robi symbol. Chcesz oświecić mnie?[[
w tym przypadku dwie następne koncepcje i otacza je funkcją @ArnoldPalmer«»
tworzy zmienne lokalne w przeciwieństwie do bałaganu zmiennych globalnych byłaby bardzo pomocna.Haskell,
161144 bajtów, Cracked przez BlackCapWejście do STDIN, wyjście do STDERR. Dodaj na końcu programu.
Edycja: Przeznaczony do kompilacji bez dodatkowych argumentów GHC, tylko normalne
ghc --make prog.hs
.Edytowane ponownie, aby obniżyć liczbę bajtów.
Baw się dobrze!
źródło
main = do x <- readLn :: IO Integer; y <- readLn; print $ x + y
main
funkcja będzie w module,Main
gdy nie-main-is
zostanie podana flaga.Mascarpone , rozbity przez Ilmari Karonen
Dane wejściowe to cyfry kościelne na stdio, używane
i
dla przyrostu iz
dla zera. Na przykład 2 + 3 to:Z końcowym znakiem nowej linii
Wynik powinien być liczbą na stdout, w tym samym formacie, co na stdio. Na przykład, jeśli odpowiedź brzmi pięć, powinieneś wypisać:
(mascarpone nie ma pojęcia liczb)
Zamierzone rozwiązanie:
Z dokumentacji nie wynika to od razu, ale jak stwierdził w swoim crackie @IlmariKaronen, dosłowne napisy w Mascarpone są tak naprawdę syntaktycznym cukrem do wypychania sekwencji znaków.
Celowo napisałem komentarze,
[this]$
aby wyglądało na to, że pcham ciąg i natychmiast go puszczam. Naiwny cracker mógł spróbować czegoś takiego jak[:,>!]/*
pchnięcie sznurka, zamiana go z tłumaczem i interpretacja.Udaję też, że wstawiłem interpretera, który zostawiłem na stosie
$
, ale$
został już przedefiniowany na NOP. Zostajesz z tym tłumaczem na stosie i musisz go nosić ze sobą przez cały program; przez każdy znak każdego ciągu.źródło
C # (.NET Core) Pęknięty przez Ilmari Karonen
Pęknięty także przez Jozuego .
Odczytuje dwie wartości ze stdin i zapisuje wynik na stdout. Testowane w systemie Windows z wersją Framework 3, 4.6 i TIO .
Oto pełny program, który zamierzałem.
Wypróbuj online!
źródło
GolfScript , złamany przez Dennisa
Wypróbuj online!
To jest code-golf wyzwaniem, mimo wszystko, więc dlaczego nie spróbować GolfScript?
Poprawnym rozwiązaniem powinien być fragment kodu, który odczytuje ze stosu dwie liczby całkowite, dodaje je do siebie i zwraca wynik na stosie. Problem polega na tym, że powinien on nadal działać, nawet jeśli powyższy kod przedefiniował prawie wszystkie wbudowane operatory GolfScript, aby nie robić absolutnie nic. Przynajmniej zostawiłem
;
nietknięty, abyś mógł nadal usuwać wartości ze stosu. ;-) Twój kod powinien działać na standardowym interpretatorze GolfScript, takim jak zaimplementowanym np. W TIO (patrz link powyżej).Rozwiązanie Dennisa , podobnie jak moje , opiera się na rzadko używanej funkcji GolfScript, która umożliwia interpolację kodu Ruby w ciągach cudzysłowów. Korzystamy z tej funkcji, aby zdefiniować nowy operator dodawania, który działa dokładnie tak, jak wbudowany
+
operator, a następnie wywołać go.(Jednym z powodów, dla których funkcja interpolacji Ruby w GolfScript jest tak rzadko używana, jest to, że niezręcznie interpolowany kod Ruby jest wykonywany podczas analizowania , a jego dane wyjściowe są buforowane przez interpreter GolfScript. Zatem jeśli np. Masz ciąg znaków z interpolowanym kodem Ruby w pętli kod uruchomi się tylko raz przed uruchomieniem rzeczywistego programu, a następnie zawsze będzie zwracał tę samą wartość przy każdej iteracji pętli. Możesz obejść to za pomocą eval ciągu, aby odroczyć parsowanie, ale to sprawia, że i tak niezręczna składnia jest jeszcze większa brzydka i gadatliwa, a w każdym razie dla tego wyzwania wyłączyłem również operatora eval
~
. Okazuje się jednak, że definiowanie nowych wbudowanych operatorów GolfScript jest jedna rzecz, którą ta funkcja robi całkiem ładnie i czysto.)źródło
"#{var'_','gpush a+b'.cc2}";_
, które działa dokładnie tak jak twoje, z wyjątkiem tego, że jest o kilka bajtów krótszy.Node.js v8.2.0, Cracked przez Dom Hastings
Masz zaimplementować tę
logic
funkcję. Dane wejściowe to dostarczone argumenty (od standardowego wejścia), dane wyjściowe są tym, co zwraca funkcja (jest wypisywane na standardowe wyjście).Mój kod kościół koduje liczby z wejścia. Reszta kodu jest po to, aby cię zastraszyć.
Funkcja bałaganu wprowadza pewne sztuczki, aby zaimplementować notację bez punktów (
a . b == dot (a) (b)
), której używam głównie do dodawania. id .
do losowych miejsc, które nic nie robią, ale dezorientują każdego, kto nie zna programowania funkcjonalnego.Transformacja zastosowana do liczb przed przekazaniem ich do
logic
funkcji wynosix+1
iy-1
, co daje w sumie 0, więc jest to kolejny NOP, który dodaje się do niejasności.Zamierzonym rozwiązaniem było:
źródło
Inform 7 , cracked by ppperry
Dane wejściowe powinny być wpisywane przez odtwarzacz jako polecenie interaktywne, np .
add 17 to 25
Lubsum 17 25
. Możesz wybrać dokładną formę polecenia, które powinno zostać wprowadzone, o ile zawiera on dwie liczby. Suma liczb (np.42
) Powinna zostać wydrukowana w odpowiedzi na polecenie.Wyzwanie oczywiście polega na tym, że cała czynność „odczytywania polecenia” jest zastępowana przez brak operacji. Prawdopodobnie istnieje kilka sposobów rozwiązania tego problemu, ale przynajmniej powinno to wymagać znajomości języka. Ten, który wymyśliłem, jest dość prosty, choć nieco nieoczekiwany.
Testowałem swoje rozwiązanie w GNOME Inform 7 IDE, wersja 6L38 , na Ubuntu Linux. Proponowane rozwiązanie działa zarówno na zapleczach Glulx, jak i na maszynie Z. Powinno także działać na innych najnowszych wersjach Inform 7. Zauważ, że (bez odpowiedniego obejścia) powyższy kod spowoduje, że interpreter będzie zapętlony podczas próby odczytania polecenia; interpreter maszyny Z wydaje się zupełnie nie reagować, kiedy to się dzieje, i nie można go zatrzymać z poziomu IDE, więc polecam używanie Glulx do testowania.
źródło
CPython 3 (ponownie), pęknięty przez Syzyfa
Możesz zrobić wszystko, co chcesz - o ile nie jest zaimplementowane w C. Oznacza to
print
, że nie , nieinput
- wszystkie z nich trafią w_(1)
linię i zakończą działanie . Wprowadzanie ze STDIN z liczbami na dwóch oddzielnych liniach, wysyłanie do STDOUT. Zastanawiam się, jak długo to potrwa ... Zajęło mi sporo czasu, aby znaleźć drugi działający fragment po wymyśleniu tej wyłączającej sztuczki. Jawne określenie Cpython, aby uniknąć pękania na podstawie innej alternatywnej implementacji sys.setprofile.źródło
functools
?Java 8 ( Cracked )
Drugie podejście. Tym razem zainwestowałem dwie minuty w testowanie.
Większość rzeczy powinna być zakryta.
źródło
Python 2 pękł
Wypróbuj online!
Przedmówię to, mówiąc, że ta odpowiedź jest palantem, mającym na celu ograniczenie odpowiedzi.
Zainspirowany odpowiedziami Kreatora pszenicy i HyperNeutrino .
Fragment odczytuje plik źródłowy i odmawia kontynuowania, jeśli ostatni fragment kodu oddzielony spacjami nie jest sha256
e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843
.EDYCJA : nieznacznie edytowane w odpowiedzi na ten komentarz . Podstawowy problem się nie zmienia, żadna próba pęknięcia nie jest unieważniona.
źródło
This code is not allowed to crash or exit.
Java 8 Cracked przez @ OlivierGrégoire
Starałem się uczynić to tak trudnym, jak to możliwe! :) I, w przeciwieństwie do innych odpowiedzi w języku Java do tej pory, będziesz musiał przestrzegać dokładnych reguł wyzwania, umieszczając go po tym całym fragmencie (więc nie, nie umieszczasz kodu w
public static void main(String[] args)
metodzie, umieszczasz go po całej klasie. :) Powodzenia!Dodałem komentarze, aby pokazać, co jest ograniczone.
( Zainspirowany tym postem, który jest mniej restrykcyjny i możliwy do pobicia dzięki temu samemu podejściu, którego mógłbym użyć do mojej odpowiedzi ).
Wypróbuj tutaj. (ideone.com zamiast TIO, ponieważ wydaje się, że tam nie działa. Testy zostały wykonane w środowisku Eclipse IDE, ale moje zamierzone rozwiązanie działa, jeśli używasz ideone.com)
źródło
Galaretka: PĘKNIĘTA
Będzie to niesamowicie łatwe w porównaniu z niesamowitą odpowiedzią Pythona na Kreatora pszenicy, ale proszę bardzo: P
Sha256 hexdigest mojego rozwiązania obejścia, w tym pierwszego fragmentu, to
cfeb1e193ad77f66f039c0d6a792a3e4c311490f6412698e019ca1fae10c0e0a
.Uwaga
Możesz nie mieć żadnych nowych wierszy w kodzie, z wyjątkiem ciągów, w przeciwnym razie ten kod nawet nie zostanie uruchomiony, co przeczy celowi tego wyzwania.
Cracked przez DJMcMayhem
Szczerze mówiąc, używa to nowej linii, więc chciałbym zobaczyć rozwiązanie, które nie korzysta z nowej linii.
Także rozwiązanie Jonathana Allana
To nie używa nowej linii, więc zostało złamane. : P
Moje rozwiązanie jest następujące:
Pierwszy fragment usuwa tylko atomy jednoznakowe, co oznacza, że eval Python nadal działa :)))
źródło
JavaScript, pęknięty
Wejście:
prompt()
dwa razyWynik:
console.log()
Moje rozwiązanie nie działa w jsfiddle. Działa na stronie about: pusta strona z konsolą JS Google Chrome.
Moje rozwiązanie:
Wyjaśnienie:
Usunąłem monit i konsolę, ustawiając je na 0.
W moim rozwiązaniu tworzę ramkę iframe, która tworzy piaskownicę, i nowe wystąpienie okna, w którym monit i konsola działają poprawnie.
źródło
Java, Cracked
To
powinno byćbardzo łatwe do złamania.Zamierzone rozwiązanie
Wypróbuj online
źródło
java.io
… Ale i tak masz zamierzone rozwiązanie…