Как мы можем сказать, что инструкция взята из кода приложения или кода библиотеки в Linux x86_64 - PullRequest
0 голосов
/ 31 октября 2019

Я хотел бы знать, является ли инструкция из пользовательского пространства или из кода библиотеки. Я заметил, что некоторые коды / данные приложения расположены примерно на 0x000055xxxx, тогда как библиотеки и mmap области по умолчанию расположены на 0x00007fcxxxx. Могу ли я использовать, например, 0x00007f00...00 в качестве границы, чтобы указать инструкцию от самого приложения или из библиотеки?

Как я могу настроить эту границу в ядре Linux?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Я хотел знать, является ли инструкция из пользовательского пространства или из кода библиотеки.

Вы смущены: оба код библиотеки и основной исполняемый код * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Linux x86_64 В Linux *1011* вы можете отличить адреса ядра от адресов пространства пользователя, потому что в текущих (48-битных) реализациях адреса ядра находятся в диапазоне от FFFF8000'00000000 до FFFFFFFF'FFFFFFFF,См. Описание адреса канонической формы здесь .

Я заметил, что некоторые коды / данные приложения расположены примерно в 0x000055xxxx, в то время как библиотеки и области mmaped по умолчанию расположены в 0x00007fcxxxx. Могу ли я использовать, например, 0x00007f00 ... 00 в качестве границы, чтобы указать инструкцию от самого приложения или из библиотеки?

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

Как уже ответил Бэйзил Старынкевич, вам нужно проанализировать /proc/$pid/maps, илизнать, по какому адресу загружен исполняемый файл (для двоичного файла без PIE).

0 голосов
/ 31 октября 2019

Сделай это по-другому. Вам нужно многому научиться.

Во-первых, прочитайте намного больше об операционных системах. Итак, прочитайте Операционные системы: Три легкие пьесы учебник .

Затем узнайте больше о ASLR .

Читайте такжеDrepper's Как писать общие библиотеки и Levine's Компоновщики и загрузчики book.

Вы хотите использовать pmap (1) и proc (5) .

Вы, вероятно, хотите проанализировать псевдофайл / proc / self / maps внутри вашей программы,Или используйте dladdr (3) .

Чтобы получить представление, запустите cat /proc/$$/maps и cat /proc/self/maps в терминале Linux

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...