- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
Решил я значит от нехуй делать нарисовать свой пиксельный шрифт
(кому интересно - вот промежуточный результат https://i.imgur.com/2vIJoio.png)
и решил посмотреть, какие там вообще бывают под GNU/Linux редакторы для
шрифтов, и какие вообще шрифты бывают
Так вот, нашел я вот такую хрень http://mensis.sourceforge.net/overview.html
Вижу, что там какой-то ассемблер http://mensis.sourceforge.net/ttfcv-all.png или
байткод ебаный. Погуглил по этим говноинструкциям со скриншота:
Оказывается в TTF шрифтах есть встроенный тьюринг-полный ЯП, используемый
для всяких там подсказок, типа "куда дорисовать пиксель вот при таком-то условии"
и прочая подобная херота
А еще в шиндошс (до Windows 10) этот шрифтоговнобайткод интерпретировался в
пространстве ядра (ну тупыыые..) и разумеется таким образом удалось винду хакнуть
https://security.stackexchange.com/a/91395 (разве могло быть иначе?)
про шрифтоговнобайткод можно почитать например тут
https://docs.microsoft.com/en-us/typography/opentype/spec/tt_instructions
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM05/Chap5.html#instructions
На кой вообще хер делать тьюринг-полный язык для отрисовки глифов? Ну и раз вы его уже
делаете, то заебошьте там что-нибудь на основе LLVM байткода, чтоб JIT, или вообще все глифы
сразу компилировать в натив, или даже (чего мелочиться) под GPU. Типа мы хотим
нарисовать какую-то букву с размером 10 - вызываем функцию
drawA(10, bufptr, x, y); - рисуется десятого размера буква в буфер. И никаких непонятных
говнобайткодов. Четко и дерзко!
https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf
@пространстве ядра (ну тупыыые..) и разумеется таким образом удалось винду хакнуть
Ты нам прям америку открыл...
А почему нельзя интерпретировать Тьюринг-полный байткод в ядре?
Но для задач, которые он решает, это оверинжиниринг имхо. Да и когда прошивка спрашивает версию венды и подстраивается под неё - это вообще нормально?
(у меня как-то раз примерно так было в Гимпе, когда я случайно поставил размер шрифта 10000)
Тут разве что общий принцип, что любой код, не требующий особых разрешений, лучше исполнять с минимальными правами - тем более сложные алгоритмы.
Хотя, конечно, и у шрифтов есть своя специфика - после переполнения буфера нужно вернуть управление, перед этим как-нибудь внедрившись в систему, а тут оно само будет периодически вызываться, можно каждый раз исполнять вредоносный код заново, не оставляя следов и не привлекая внимание антивируса.
>https://security.stackexchange.com/a/91395
Как у них там красивенько сегодня! (см. дату)
https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
> All this guarantees that the BPF programs executed within kernel context will run fast and will never infinitely loop. That means the BPF programs are not Turing complete, but in practice they are expressive enough for the job and deal with packet filtering very well.
Вместо того чтобы просто доказать, что программа завершается за ограниченное число шагов.