Эта программа полна непечатаемых символов, поэтому вот hexdump:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
Примечание: при этом используется процедура ввода чисел, которая не может вводить отрицательные числа, поэтому эта отправка ограничена только неотрицательными целыми числами.
Одна из проблем, с которыми сталкиваются полицейские и грабители, заключается в том, что вы не пишете объяснения кода (чтобы его было сложнее взломать). С другой стороны, это означает, что мне здесь не нужно беспокоиться.
Я выбрал 7 в качестве языка, потому что, особенно в сжатом виде, его довольно сложно читать, и я не понимаю, почему это должен быть только я должен идти по пути перемещения по 8-битным фрагментам программ, написанных на 3-х битная кодировка. Удачи!
объяснение
Теперь, когда программа взломана (к сожалению, грубой силой; в этих коротких решениях это всегда опасно), я могу также объяснить, к чему я стремился. Это было на самом деле довольно решаемо, читая программу; Я мог бы сделать это намного сложнее, но это казалось плохой идеей, когда существуют грубые трещины.
Начнем с представления программы в более естественной кодировке. Как обычно, полужирный цифры показывают команды , которые выполняются немедленно (не все из которых представима в программе, 6
и 7
являются , но 2
для 5
не являются), unbolded числа представляют их уцелевшие эквиваленты ( 0
к 5
, все из которых представима в исходной программе, к сведению что 0
сбежал 6
и 1
сбежал7
):
112 7 1 7 34002 77 023 67 13303
Набор команд, доступных в программном источнике 7, означает, что это в основном просто литерал, представляющий исходный стек (больше ничего вы не можете сделать с помощью только экранированных команд 6
и 7
). Итак, первое, что сделает программа, это поместит кучу вещей в стек. Вот как выглядит стек после запуска программы ( |
разделяет элементы стека, как обычно в 7):
772 | 7 | 34662 | 023 | 73363
Последний элемент стека затем копируется, чтобы стать кодом для запуска (оставаясь в стеке). Как это бывает, это единственная часть программы, которая является кодом; все остальное - просто данные. Вот что это переводит на:
73363
7 Поместите пустой элемент в стек.
3 Выведите верхний элемент стека, отбросьте элемент ниже.
73 Совокупный эффект: отбросьте верхний элемент стека.
3 Выведите верхний элемент стека, отбросьте элемент ниже.
6 Сбросьте верхний элемент стека, затем добавьте его к элементу ниже
3 Выведите верхний элемент стека, отбросьте элемент ниже
Другими словами, это в основном просто набор инструкций ввода / вывода. Давайте проанализируем это подробно:
73
сбрасывает 73363
это все еще на вершине стека.
3
выводит 023
и отбрасывает 34662
. Таким образом, можно видеть, что 34662
это комментарий, который использовался для хранения байтов, необходимых в другой версии программы. Что касается того, что 023
происходит при выводе, он выбирает формат ввода / вывода 0 (целые числа), а затем 23
является директивой, которая запрашивает реализацию для ввода целого числа (в 7 вы вводите с помощью вывода определенных кодов, которые запрашивают ввод). Ввод осуществляется путем создания копий элемента стека, указанного ниже, например, если целое число ввода равно 10, следующий элемент стека (в настоящее время 7
) станет 7777777777
. Таким образом, мы принимаем ввод от пользователя в десятичном виде, но он сохраняется как унарный.
6
экранирует верхний элемент стека (изменяя каждый экземпляр 7
на 1
; таким образом 7
экранируются строки, состоящие полностью из s), затем добавляет его к элементу стека before ( 772
). Таким образом, наши данные теперь что-то вроде 7721111111111
.
- Наконец,
3
выводит соответствующий элемент стека (и выводит пустой элемент стека, который является частью начального стека по умолчанию). Его значение рассчитывается путем взятия числа 1
s и 7
s и вычитания числа 0
s и 6
s. ( 2
Посередине в большинстве случаев игнорируется; если он находится в конце строки, он будет становиться завершающим символом новой строки вместо того, чтобы игнорироваться, но правила PPCG не заботятся об этом.) Таким образом, вывод является исходным вход плюс 2.
На данный момент в стеке нет ничего полезного и ничего в программе, поэтому программа завершается.
Как мы можем изменить это? Это простой вопрос об изменении 11
в 00
, так что мы добавляем символы на входе , которые делают его 2 ниже, а не 2 выше. Там в 00
удобно скрытые восемь восьмеричных цифр далее в программе (так что восьмеричные цифры и байты выстраиваются друг с другом), поэтому мы просто не можем поменять его с 11
самого начала.