1. Си / Говнокод #24192

    −9

    1. 1
    Вопрос

    Кто знает, как динамически выделить память, заполнить её нужными инструкциями, и исполнить этот код, не испытав при этом анальной боли и не получить Segmentation Fault ?

    Запостил: yet_another_one_shit, 23 Апреля 2018

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

    • Наблевал в твой родник, проверь.
      Ответить
    • Изи же. Генеришь бинарник и выполняешь
      Ответить
      • А без создания исполняемого файла никак ? нельзя ли это провернуть в памяти ?
        У меня получается только со статической.
        Ответить
        • Под вендой VirtualProtect, под линухой mprotect.
          Ответить
          • вообще-то mprotect это для изменения защиты. Можно через mmap сразу исполняемый регион зааллоцировать
            Ответить
            • он же хочет выделить, заполнить и выполнить
              Ответить
              • Таки да, с mmap будет меньше анальной боли, с mprotect вроде бы сперва нужно выровнять указатель. И в память, веделенную mmap, тоже, вроде бы, можно пописать и покакать.
                Ответить
                • Разумеется нужно, ведь права за запись и выполнение устанавливаются на уровне страницы в x86 (в 32 битах могли еще на уровне сегмента, но так никто не делал).

                  Начиная с x64 прямо у страницы есть битик NX, а в 32 режиме такого битика не было, и в некоторых случаях можно было самомодифицировать код, но не везде.

                  К примеру OpenBSD защищала страницы софтварно еще до появления хардварной защиты от amd64.
                  Называлась эта защита W^X (запись-или-исполнение), кажется на нее намекал там снизу Санут:)

                  Анонимно замапить mmap и сказать что ты хочешь PROT_EXEC и PROT_WRITE, наверное, можно (хотя это конечно странное желание), однако
                  в Linux это должно сработать (во всяком случае mmap(2) ничего страшного не обещает), думаю что остальные обычные ОС поступят так же.

                  Ну а упомянутая выше obsd пошлет тебя нахуй (ENOTSUP), если ты явно не включишь режим пониженной безопастности.

                  На винде, емнип, нет анонимного мапинга (только в файл), но можно сделать HeapCreate со спец ключиком, и вся выделямая из этого хипа память будет разрешена для выполнения (ну и для записи самособой)
                  Ответить
            • w^x
              Ответить
        • А если совсем без боли -- цепляй LLVM, генери код их функциями (правда там будет IR, а не нативный асм) и прогоняй через JIT (из коробки есть там).
          Ответить
          • Спасипки !

            ЗЫ. Совсем без боли не бывает, про LLVM я знаю, просто хочу зопилить малипюзерный JIT, без всяких там LLVM'ов, чтобы самому с этим всем разобраться.
            Ответить
            • Да вирус ты пишешь, а все что может быть опознано как сигнатура антивирусом скрываешь и "на лету" создаешь и выполняешь.
              Ответить
    • Кстати если для ARM делать JIT, надо еще особым образом сбрасывать кэш инструкций
      https://community.arm.com/processors/b/blog/posts/caches-and-self-modifying-code
      Ответить
    • Все просто. Линкуешься с libnapiton, иницелизируешь ее, выделяешь память с помощью фукции malloc (динамически), заполняешь ее нужными инструкциями (с помощью оператора =) и передаешь указатель на эту память в функцию PyRun_SimpleString (чтобы выполнить).
      Тут подробнее https://docs.python.org/2/extending/embedding.html
      Ответить

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