(←) предыдущая запись ; следующая запись (→)

(Хорошие) программисты такие люди, что всё время ищут, как что-то можно сломать и как можно эксплуатировать недостатки системы 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)