LINUX.ORG.RU

Выполнение функции в ядре


0

2

Hello! столкнулся с такой проблемой
Присваиваю указателю на функцию адрес, функции ядра. Далее пытаюсь её выполнить. (вызвать функцию по своему указателю) и сразу вылетает oops
kernel tried to execute NX-protected page - exploit attempt? (uid: 0)
BUG: unable to handle kernel paging request at c1904e10

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

Deleted

Да никак, лол. Твой юзерспейсный процесс не имеет привилегий запускать функции ядра. Как ты додумался до такого и что хочешь сделать? Обычно используют системные вызовы.

hvatitbanit
()
Ответ на: комментарий от Deleted

А ты конкретней не можешь рассказать, что твой модуль делает.

Там даже надпись NX-protected page. NX - not executable. Уверен, что там функция?

hvatitbanit
()
Ответ на: комментарий от hvatitbanit

Вызываю через указатель одну из функция VFS (тут не важно даже какую, т.к. проблема со всеми функциями). На ядрах версии 3,2,* данный способ работал. Теперь пробую код запустить на ядре 3,11,0 и он не работает. Т.К. включен NX-protect. Как я предполагаю, нужно явно указать в ядре, что мой указатель может вызываться, как функция. Как это сделать правильно?

Deleted
()
Ответ на: комментарий от hvatitbanit

Да никак, лол. Твой юзерспейсный процесс не имеет привилегий запускать функции ядра. Как ты додумался до такого и что хочешь сделать? Обычно используют системные вызовы.

Очевидно, юзерспейсный код физически не может вызвать функции ядра, т.к. в его адресном пространстве этих функций нет.

staseg ★★★★★
()
Ответ на: комментарий от Deleted

Как я предполагаю, нужно явно указать в ядре, что мой указатель может вызываться, как функция.

Как будто CPU есть дело до языка, на котором ты пишешь. Там просто исключение срабатывает при попытке перепрыгнуть по этому адресу. А почему раньше работало - даже не скажу.

Лучше подожди спецов по линуксу, а я погуглю и скажу, если чё найду

hvatitbanit
()
Ответ на: комментарий от Deleted

Никто не сталкивался с данной проблемой?

Deleted
()

Присваиваю указателю на функцию адрес, функции ядра.

Покажи, как именно ты это делаешь.

const86 ★★★★★
()
Ответ на: комментарий от const86
 
typedef int (*iterate_t)(struct file *file, struct dir_context *ctx); // определили новый тип, указатель на функцию


iterate_t orig_iterate = NULL; // мой указатель на ф-ю при вызове которого происходит ошибка доступа

/*
гдето в коде записали РАБОЧИЙ указатель на функцию ядра iterate в orig_iterate
orig_iterate = "реальный указатель ядра"
*/

// моя функция
(file, ctx - корректные!)
int my_iterate_dir(struct file *file, struct dir_context *ctx)
{
  /* вызываем оригинальную функцию */
  orig_iterate(file, ctx);  // при этом вызове в dmsg заносится ошибка, и выполнение модуля "убито"
} 



Deleted
()
Ответ на: комментарий от Deleted

Пока что, судя по тому коду, что ты написал у тебя вызывается NULL. Показывай почему ты считаешь, что в orig_iterate у тебя будет валидный указатель.

anonymous
()
Ответ на: комментарий от anonymous

Указатель верный. Проверял выводом адреса через printk.
Проблема в этом NX-protecte . Как мне явно указать, что кусок памяти где находится код вызова функции, разрешён для выполнения?

Deleted
()

говнокодер детектед
функция возращает int, но конечно ты на это забил и ничего не возращаешь

а вообще в студию
1) твои соурсы
2) полный вывод кернел паника

anonymous
()
Ответ на: комментарий от anonymous

Сорцы в студию? я убрал всё лишнее из кода и уже показал что и как вызываю.
Функция возвращает int, аналогично и моя функцию возвращает int да вот только , почему-то Вы понять не можете, что сбой происходит не при возвращении из функции, ни при процессе её выполнения, а при ВЫЗОВЕ! Не при выполнении! а вызове! т.е. мы бац, вызываем функцию, а система не позволяет это сделать, т.к. в ней защита NX-protected включена. Мне нужно указать явным образом! что память (page) в которой расположен указатель, явно разрешен для выполнения! Как это сделать?
Вывод kernel_panic ? зачем? я уже точно пояснил где кроется проблема.

Deleted
()
Ответ на: комментарий от Deleted

Мне нужно указать явным образом! что память (page) в которой расположен указатель, явно разрешен для выполнения!

в памяти, отведенной под указатель, не содержится кода, выполняемого процессором, поэтому никаких разрешений на эту память выдавать не нужно; там находится число, которое процессор вычитывает как данные, и выполняет call на новый адрес, расчитанный с использованием этого числа; после инструкции call выполняется уже код, расположенный по этому адресу, и вот если этот адрес неправильный, т.е. попадает в защищенную от выполнения область памяти, то тогда и срабатывает защита — твой указатель просто указывает куда-то не туда, видимо из-за какой-то ошибки в коде, который есть только у тебя, так что ищи сам почему так происходит или давай подробный код

anonymous
()
Ответ на: комментарий от anonymous

Ещё раз.
некая функция ядра, выполняется самим ядром постоянно, значит эта память доступна для выполнения!
Эта функция ядра имеет адрес, скажем 0x12345678 , так вот теперь мой указатель указывает на 0x12345678 (проверено!). Аргументы передаваемые моему указателю на функцию совершенно верные!
Аргументы , возвращаемое значение аналогичны орегиналу. Еслиб указатель был не верен, то упс, указывал бы, что он или равен null либо система висла! Этого нет! т.к. адреса верны! В dmesg выводится сообщение "kernel tried to execute NX-protected page - exploit attempt? (uid: 0)". Если nx отключен, то код корректно работает.
Скажите хоть как явно разрешить выполнение кода.

Deleted
()
Ответ на: комментарий от Deleted

у всех работает у тебя не работает, в чем проблема? в кривых руках! пока реального кода нет, иди сам разбирайся

anonymous
()

А зачем ты пытаешься засунуть произвольный код в произвольное место? Есть несколько уровней защиты системы (даже внутри ядра, и ядра от самого себя). Если тебе надо просто выполнить что-то, есть экземпляры драйверов, которые выполнены по типу «хеллоу ворлд». Открывай их и пиши там свои коды.

sanaris
()
Ответ на: комментарий от Deleted

теперь мой указатель указывает на 0x12345678 (проверено!)

в каком месте проверял? сразу после присвоения?

Если nx отключен

как отключал?

у тебя есть адрес 'c1904e10', где срабатывает защита, у тебя должен быть дамп регистров и call-stack в dmesg; смотри что находится по этому адресу, как туда пришел CPU
а истерить здесь и топать ногами требуя какую-то неведомую х$йню, в которую ты свято веришь, нихрена не понимая что происходит на самом деле, совершенно не сто́ит

anonymous
()
Ответ на: комментарий от sanaris

Если не сложно дайте названия этих механизмов, или названия файлов где можно поизучать данный код.

Deleted
()
Ответ на: комментарий от Deleted

а при ВЫЗОВЕ!
Не при выполнении! а вызове!
Вывод kernel_panic ? зачем? я уже точно пояснил где кроется проблема.

— доктор, сделайте мне кастрацию!
— вы уверены?
— да! быстрее!
— готово.
— ой, доктор, что вы сделали?!
— то, что вы просили, а вам не нравится? может вы имели в виду обрезание?
— хм... может быть, а в чем разница?

anonymous
()
Ответ на: комментарий от Ubuntu1210

Ну и дай ссылку на тот пост, где показано почему он считает, что в orig_iterate будет валидный указатель. Желательно код.

anonymous
()
Ответ на: комментарий от anonymous

Ну и дай ссылку

нет никаких ссылок, ТС просто «уверен, что все валидно» и все тут, вбил себе в голову, что нужно указатель на функцию снабдить каким-то волшебным квалификатором «и зае^Hработает»

anonymous
()
Ответ на: комментарий от anonymous

вбил я себе в голову что верный указатель, т.к. проверил уже на 5-ти разных системах работу. Код функцианирует должным образом. Далее вывод через printk и указатели на оригинал, имеют одинаковые адреса (не мудрено, т.к. на 5-ти других системах работает).
Спрашиваю одно в теме
Как явно разрешить память для выполнения а мне тут пытаются отвечать только в стиле «быдлокодер», «указатель не верен», «покажи полный вывод» и тп.
Ладно ещё можно понять «покажи полный вывод oops» ... даже личные медецинский проблемы рассказали...

Deleted
()
Ответ на: комментарий от Deleted

да ты просто упорот :)
тебе сто раз сказали, что память сегмента кода разрешена для выполнения, а в указателе исполняемого кода нет

вывод через printk и указатели на оригинал, имеют одинаковые адреса

а с адресом, на котором сработала защита, эти адреса совпадают?

ты же не можешь ни весь oops предоставить, ни сам понять что там написано

ЗЫ: вангую кривой указатель file->f_op->read или write или другой операции из списка, или что-то в этом роде, но ты же уверен, что указатель валиден; зачем что-то предполагать, когда можно посмотреть call-stack, сделанный специально для таких случаев, и сказать более определенно?

anonymous
()
Ответ на: комментарий от anonymous

Прежде чем забить на эту тему, хотел сказать, что я как всегда оказался прав.
Рассуждения мои верны.
Разобрался сам.
И еще, кто ж мог подумать...указатели то все мои верно были указаны (раза 4 это писал, приводил примеры как определял адреса, как сверял..но почему-то по не понятным мне причинам, не был услышан). Не школьников не дождался.
Не расстроен, изначально знал что вероятность получения нормального ответа на вопрос, где-то 1/8
Создал тему, не фортануло...повезет в следующих вопросах.

Deleted
()
Ответ на: комментарий от Deleted

Ну а более предметно раскрыть как решена была проблема, не я понимаю что побыть Д'Артаньяном это приятно, но все же)

pylin ★★★★★
()
Ответ на: комментарий от pylin

Могу в личку отписать, что в коде нужно изменять но с условием, что в тему это не попадёт. Пусть разбираются сами, уверен многим это пойдёт на пользу.

Deleted
()
Ответ на: комментарий от Deleted

Так и запомним: featurelles-у больше никаких ответов ни на один вопрос не давать.

Пусть разбирается сам. Уверен это пойдёт ему на пользу.

anonymous
()

Ну ты и перец, ничего не покажу, гадайте сами, а теперь решил и всё равно не покажу. Сам догадаешься, кто ты?

false ★★★★★
()
Ответ на: комментарий от Deleted

Тред-то закрой.

И, кстати, твоё решение неправильное.

ziemin ★★
()
Ответ на: комментарий от Deleted

Могу в личку отписать, что в коде нужно изменять но с условием, что в тему это не попадёт. Пусть разбираются сами, уверен многим это пойдёт на пользу.

слив засчитан

anonymous
()
Ответ на: комментарий от Deleted

лол, тебе уже сказали, у всех работает, а результаты копания твоего говнокода никому не интересны

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.