1. Assembler / Говнокод #25491

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 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); - рисуется десятого размера буква в буфер. И никаких непонятных
    говнобайткодов. Четко и дерзко!

    Запостил: j123123, 01 Апреля 2019

    Комментарии (30) RSS

    • показать все, что скрытоvanished
      Ответить
    • @А еще в шиндошс (до Windows 10) этот шрифтоговнобайткод интерпретировался в
      @пространстве ядра (ну тупыыые..) и разумеется таким образом удалось винду хакнуть

      Ты нам прям америку открыл...
      Ответить
      • >тупыыые
        А почему нельзя интерпретировать Тьюринг-полный байткод в ядре?
        Ответить
        • Потому что рано или поздно это выстрелит в ногу.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Не ну AML, конечно, лучше чем произвольный нативный код (привет UEFI рантайм сервисам).

              Но для задач, которые он решает, это оверинжиниринг имхо. Да и когда прошивка спрашивает версию венды и подстраивается под неё - это вообще нормально?
              Ответить
          • Ну, выстрелить в ногу чем угодно можно - везде, где есть буфер, его можно переполнить, и так далее... (тут, как я понял, что-то подобное как раз и произошло). Тут единственное, что можно сделать - это подвесить рендерер бесконечным циклом (кстати, интересно, как с этим борются?), и пользователь, забывший сохранить свою фотожабу после двух часов работы и перед вставкой красивой подписи скачанным из интернета шрифтом, сам испортит какое-нибудь hardware, даже не выходя из юзермода.
            (у меня как-то раз примерно так было в Гимпе, когда я случайно поставил размер шрифта 10000)
            Тут разве что общий принцип, что любой код, не требующий особых разрешений, лучше исполнять с минимальными правами - тем более сложные алгоритмы.
            Хотя, конечно, и у шрифтов есть своя специфика - после переполнения буфера нужно вернуть управление, перед этим как-нибудь внедрившись в систему, а тут оно само будет периодически вызываться, можно каждый раз исполнять вредоносный код заново, не оставляя следов и не привлекая внимание антивируса.
            Ответить
            • P.S.
              >https://security.stackexchange.com/a/91395
              Как у них там красивенько сегодня! (см. дату)
              Ответить
    • показать все, что скрытоvanished
      Ответить
      • > а еще там есть BPF который наверняка уже тоже туринг полны

        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.
        Ответить
    • Почему не поштшшкрипт?
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий