(←) предыдущая запись ; следующая запись (→)
(Хорошие) программисты такие люди, что всё время ищут, как что-то можно сломать и как можно эксплуатировать недостатки системы for fun and profit.
Наличие разных типов непечатаемых символов позволяет использовать их вместо двоичного/троичного кода. А если таких символов много, то даже вместо команд.
Возможно, вы знаете язык программирования brainfuck. Это язык, чем-то похожий на машину Тьюринга: это лента памяти, по которой ездит исполнитель и исполняет инструкция за инструкцией.
Его особенность в том, что в нём всего 8 команд (и при этом он Тьюринг-полный!). Каждая команда кодируется одним символом:
— сдвинуться на следующую ячейку ленты памяти
< — сдвинуться на предыдующую ячейку ленты памяти
- — увеличить текущую ячейку на 1
- — уменьшить текущую ячейку на 1
. — напечатать символ, чей ASCII код записан в текущей ячейке
, — считать значение в текущую ячейку
[ — зайти в цикл while, если текущая ячейка не ноль
] — пометить последнюю инструкцию цикла, иначе выйти из него
У брейнфака есть несколько диалектов. Например, Ook — это язык на котором мог бы программировать Библиотекарь Пратчетта. Он кодирует команды брейнфака в троичном коде. Триты принимают значения: Ook. Ook? Ook!
Есть язык Whitespace, который кодирует свой набор команд символами пробела, табуляции и перевода строки. Но в нём всё-таки есть и другие символы, помимо пробелов.
Anguish — также является диалектом Brainfuck-а. Но все восемь команд кодируются непечатными символами (они внутри квадратных скобок, можете проверить):
> [] U+2060 WORD JOINER [Cf]
< [] U+200B ZERO WIDTH SPACE [Cf]
+ [] U+2061 FUNCTION APPLICATION [Cf]
- [] U+2062 INVISIBLE TIMES [Cf]
. [] U+2063 INVISIBLE SEPARATOR [Cf]
, [] U+FEFF ZERO WIDTH NO-BREAK SPACE [Cf]
[ [] U+200C ZERO WIDTH NON-JOINER [Cf]
] [] U+200D ZERO WIDTH JOINER [Cf]
Теперь на детскую загадку про «А и Б сидели на трубе…» вы можете смело отвечать, что между буквами затесалась целая программа. Например, сюда я скопировал код hello world. Здесь буквы А,Б и 130 символов между ними (я не шучу):
АБ
Кстати, в линуксовой версии телеграма баг: показывается zero-width space ненулевой ширины.*
Как вы понимаете, вместо такой безобидной программы можно случайно скопировать и какой-нибудь вирус. ;)
(6/7)