![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
jeka23 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 29.3.2008 Репутация: нет Всего: нет |
Добрый день.
Господа программеры, прошу помочь кому не сложно с небольшой проблемкой: Если обяснять просто, то ситуация такова: Пишу собственный загрузчик. Выделяю память с помошью malloc, вписываю туда бинарный код из исполняемого файла, а потом ссылаюсь на эту память с помошью указателя на функцию и вызываю. Происходит Segmentation Fault, в ассме четко видно, что не позволяет запустить функцию, хотя в памяти видно, что бинарный код ф-ии верный и все правильно. 100%, что malloc не дает прав на EXECUTE. Как выделить память чтобы были права на EXECUTE? Заранее благодарю! |
|||
|
||||
RasenHerz |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.3.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
начнем с самого начала...
во-первых, я глубоко сомневаюсь, что ты пишешь загрузчик ![]() во-вторых, шелл-код - это плохо ![]() в-третьих, если даже ты и начнешь выполнять код на уровне ядра(а для этого надо написать модуль, и загрузить его в ядро(конечно же root'ом)), то здесь поджитает следующая проблема: стандартная библиотека С в ядре не работает и ее использование в ядре НЕВОЗМОЖНО, так что придется тебе , в основном оперировать ф-цией do_mmap() (я молчу про то что ты должен на зубок знать ассемблер) в общем, ты слишком уж замахнулся =))) так что если хочешь все-таки написать эту программу, то следующая лит-ра тебе не будет лишней: Д.Бовет, М. Чезати "Ядро Linux", Р. Лав "Разработка ядра Linux" + С.А. Раго, Стивенс "Unix. Профессиональное программирование" |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
1. показывай код 2. защита от выполнения может быть только на аппаратном уровне какой процессор используется? бред для процессоров без поддержки NX-бита проблемы нет если NX-бит поддерживается и используется проблема может быть, но она решается через __ioremap() несколькими строчками да, кроме того, с чего вы взяли, что jeka23 работает с ядром? загрузчик вполне может работать на пользовательском уровне и отображать некий код на линейное адресное пространство текущего процесса с разрешением всех релокаций (такое может быть, например, если используется специфичный формат входных файлов, о котором не знает LD, для реализации какой-нибудь виртуальной машины) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
А можно просто посмотреть исходники /lib/ld-x.y.z.so
|
|||
|
||||
RasenHerz |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.3.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
пусть покажет исходный код, без него мне будет крайне тяжело продолжать обсуждения в топике. MAKCim, вы должны знать что именно ф-ция do_mmap() из файла <mm.h>, выделяет новый "участок" линейных адресов(первый желаемый адрес может попробовать указать программист) который по-умолчанию помечается как готовый на ЗАПИСЬ. ЧТЕНИЕ И, самое главное, ИСПОЛНЕНИЕ. думаю, самое то будет разместить шелл-код именно там =), чем сидеть и извращаться с инлайн-ассемблером ;). P.S. я не говорю что jeka23 работает именно с ядром, просто осуществить все задуманное легче всего через интерфейсы ядра. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
это, конечно, хорошо я с этим и не спорю но вопрос то был в этом
все зависит от того, что надо получить в итоге -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
RasenHerz |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.3.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
что-то я не очень понимаю о чем вы говорите. но давайте, попробуем разобраться =): 1) Вот типичный шелл:
с тем, что ядро такие штуки не допускает я, конечно, загнул, т.к. являюсь ярым противником таких садистических увлечений =), но согласитесь, запуск шелла из собственного стека(!!!) это уже чересчур... не проще ли нормално "попросить" ядро выделить адреса для кода??? 2) Я все же жду от автора топика исходный код... =) |
||||||||
|
|||||||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
RasenHerz,
я не понимаю, к чему ваш последний пост причем здесь стек... -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
"Чукча не читатель - чукча писатель" ![]() |
|||
|
||||
RasenHerz |
|
||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.3.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
<...> именно ф-ция do_mmap() из файла <mm.h>, выделяет новый "участок" линейных адресов(первый желаемый адрес может попробовать указать программист) который по-умолчанию помечается как готовый на ЗАПИСЬ. ЧТЕНИЕ И, самое главное, ИСПОЛНЕНИЕ. думаю, самое то будет разместить шелл-код именно там =), чем сидеть и извращаться с инлайн-ассемблером ;).
с тем, что ядро такие штуки не допускает я, конечно, загнул,<...>
Вот типичный шелл:
ничего не стоит переделать этот код для размещения шела в куче.
теперь все всем понятно? могу для особо одаренных объяснить более подробно.... |
||||||||||
|
|||||||||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
товарищ jeka23 использует malloc() (-> mmap()/brk() -> |kernel| -> do_mmap()) т. е heap
не понятно ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
RasenHerz |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.3.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
RasenHerz,
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
RasenHerz |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.3.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
за что предупреждение??? по-моему я никого не оскорбил...
|
|||
|
||||
jeka23 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 29.3.2008 Репутация: нет Всего: нет |
И сново здравствуйте.
Уведомление на почту не работает почему-то, поэтому я и не предпологал, что мне люди отозвались, за что огромное Вам спасибо. И в правду, MAKCim прав - ядро здесь не причем, загрузчик пишется на пользовательском уровне. Большое спасибо за список литературы, я эти книжки с удовольствием читал уже, но вот до практики написания модулей никак не смог дойти, устройство ядра было просто интересно. И ассмом я немного владею, но не на профи уровне. Слаб я еще в таких вопросах как собственный загрузчик, но доделать работу очень надо, поэтому и обратился, прошу помочь. Народ.... признаю, что не совсем хорошо так, но код в студию никак выложить не могу, если кто из своих увидят - голову оторвут.... Обясню ситуацию чуть подробней: Есть движок на пользовательском уровне, который переписывается отдельно под разные платформы. К этому движку идут бинарники, не прилинкованы ни к одной функции винды, но собранные под виндой с целью использования их под разными платформами. Я был конечно не прав, что использовал malloc, RasenHerz прав. Заменил на mmap с флагом PROM_EXEC и теперь ситуация немного другая: У данных бинарников задан base image address - 0x33310000, а base image address у такого же "движка" под винду - 0x33300000 и расчет идет на то, что и под линуксом base image address будет задан 0x33300000 у "движка", а у меня получается такая ситуация, что "движок" под линуксом грузится на произвольный адрес (например 0x85af34ec23) и когда с помошью mmap выделяется память и первый параметр передается желаемый адрес выделяемой памяти(0x33310000), то память выделяется, но сразу же помечается как "out of bounds" и дальнейшая работа загрузчика не может продолжатся так как на первом же memcpy все валится с SIGBUS. Я так понимаю, что вся фишка в том, что мне нужно base image address у линуксового "движка" поставить в 0x33310000, но никак не могу найти как это сделать с g++ компилятором..... Может кто-нить подсказать как это делается? Еще раз извиняюсь, что не имею права давать код! ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |