Ten program jest pełen znaków niedrukowalnych, więc oto zrzut heksowy:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
Uwaga: używa to procedury wprowadzania liczb, która nie jest w stanie wprowadzić liczb ujemnych, więc to przesłanie jest ograniczone tylko do nieujemnych liczb całkowitych.
Jednym z problemów związanych z wyzwaniami gliniarzy i rabusiów jest to, że nie piszesz wyjaśnień kodu (aby utrudnić złamanie). Z drugiej strony oznacza to, że nie muszę tutaj zadawać sobie trudu.
Jako język wybrałem 7, ponieważ, szczególnie w jej skompresowanej notacji, jest dość trudny do odczytania i nie rozumiem, dlaczego to tylko ja muszę zadawać sobie trud z przemieszczaniem się po 8-bitowych fragmentach programów napisanych w 3-bitowe kodowanie. Powodzenia!
Wyjaśnienie
Teraz, gdy program został złamany (niestety brutalną siłą; to zawsze stanowi zagrożenie w tych krótkich rozwiązaniach), równie dobrze mogę wyjaśnić, o co mi chodziło. To było właściwie dość do rozwiązania, czytając program; Mogłem uczynić to znacznie trudniejszym, ale to wydawało się złym pomysłem, gdy istnieją pęknięcia z użyciem siły.
Zaczniemy od przedstawienia programu w bardziej naturalny sposób. Jak zwykle, pogrubione cyfry oznaczają polecenia, które działają natychmiast (z których nie wszystkie są reprezentowalna w programie, 6
i 7
to tylko 2
na 5
nie), numery unbolded reprezentowania ich ekwiwalenty (uciekł 0
do 5
, z których wszystkie są reprezentowalna w oryginalnym programie; notatka to 0
jest ucieczka 6
i 1
ucieczka 7
):
112 7 1 7 34002 77 023 67 13303
Zestaw poleceń dostępnych w źródle 7 programów oznacza, że jest to po prostu literał reprezentujący oryginalny stos (nic więcej nie można zrobić za pomocą tylko znaków ucieczki 6
i 7
). Pierwszą rzeczą, którą program zrobi, jest wrzucenie stosu rzeczy na stos. Oto jak wygląda stos po uruchomieniu programu ( |
oddziela elementy stosu, jak zwykle w 7):
772 | 7 | 34662 | 023 | 73363
Ostatni element stosu jest następnie kopiowany, aby stać się kodem do uruchomienia (pozostając na stosie). Tak się składa, że jest to jedyna część programu, która jest kodem; wszystko inne to tylko dane. Oto, co to tłumaczy:
73363
7 Wciśnij pusty element na stos
3 Wyrzuć górny element stosu, odrzuć element poniżej
73 Łączny efekt tych: odrzuć element górnego stosu
3 Wyrzuć element górnego stosu, odrzuć element poniżej
6 Wyjdź z górnego elementu stosu, a następnie dołącz go do elementu poniżej
3 Wyjmij element górnego stosu, odrzuć element poniżej
Innymi słowy, jest to głównie garść instrukcji We / Wy. Przeanalizujmy to szczegółowo:
73
odrzuca to 73363
, co wciąż jest na wierzchu stosu.
3
wypisuje 023
i odrzuca 34662
. W ten sposób można zauważyć, że 34662
jest to komentarz, który został użyty do przechowywania bajtów potrzebnych w innej wersji programu. Jeśli chodzi o to, co 023
dzieje się podczas wyjścia, wybiera format wejścia / wyjścia 0 (liczby całkowite), a następnie 23
dyrektywę, która żąda od implementacji wprowadzenia liczby całkowitej (w 7 wprowadzasz dane wyjściowe, wysyłając określone kody, które wymagają wprowadzenia). Wprowadzanie odbywa się poprzez wykonanie kopii elementu stosu poniżej, np. Jeśli wejściowa liczba całkowita wynosi 10, stanie się następny element stosu (obecnie 7
) 7777777777
. Dlatego akceptujemy dane wprowadzane przez użytkownika w postaci dziesiętnej, ale są one przechowywane jako jednoargumentowe.
6
ucieka z górnego elementu stosu (zmieniając każde wystąpienie 7
na 1
; w ten sposób są uciekane ciągi składające się wyłącznie z 7
s), a następnie dołącza go do elementu stosu przed ( 772
). Więc nasze dane są teraz coś w rodzaju 7721111111111
.
- Na koniec
3
wyprowadza dany element stosu (i wyrzuca pusty element stosu, który jest częścią domyślnego stosu początkowego). Jego wartość jest obliczana na podstawie liczby1
s i 7
s, i odejmując liczbę 0
s i 6
s. (Środek 2
jest w większości przypadków ignorowany; jeśli znajduje się na końcu ciągu, stanie się końcowym znakiem nowej linii, a nie zostanie zignorowany, ale reguły PPCG nie przejmują się tym.) wejście plus 2.
W tym momencie na stosie nie ma nic użytecznego i nic w programie, więc program się kończy.
Jak to odwrócić? Jest to prosta sprawa zmieniając 11
się 00
tak, że jesteśmy poprzedzenie znaków do wejścia, które czynią go 2 niższe, aniżeli 2 wyższego. Jest00
wygodnie ukrytych osiem cyfr ósemkowych (tak, aby cyfry i bajty ósemkowe były ze sobą w linii), więc możemy po prostu zamienić je 11
na początku.