Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Самомодифицирующийся код на Linux

#cpp #linux


Код
#include 

void main() {
    void *p = &&modify;

    modify:
    // Перезаписать цифру пять нулем, 18 - это смещение от текущего адреса
    *(unsigned int *)((unsigned int)p + 18) = 5;
    printf("This is five = %d\n", 0);
}

должен сам себя менять.
Собирается бинарий
gcc selfmodify.c -o selfmodify

и снимается запрет на запись на секцию .text
objcopy --set-section-flags .text=alloc,code ./selfmodify

В итоге все падает с ошибкой сегментации в момент перезаписи нуля пятеркой.
У меня возник вопрос, а Linux реально разрешает переписывать свою секцию .text, если
в ELF файле снят запрет на запись?    


Ответы

Ответ 1



Линукс позволяет переписывать свою секцию .text, если флаг, запрещающий запись, снимается во время исполнения с помощью системного вызова mprotect. Еще надо иметь в виду, что на некоторых процессорах, например, семейства ARM необходимо сбросить кэш, чтобы процессор выполнил именно заново прописанные инструкции вместо закэшированных.

Ответ 2



Так вы модифицируете область памяти, а не исполняемый файл. Linux не следит за тем что вы делаете с ней. Так что всё должно работать. Надеюсь вы это в академических целях используете :-)

Комментариев нет:

Отправить комментарий