Как загрузить и выполнить двоичный исполняемый файл ELF вручную? - PullRequest
8 голосов
/ 02 июля 2011

Предположим, двоичный файл - это PIC. Как я могу загрузить его в память и выполнить точку входа? Я делаю это, чтобы познакомиться с ELF, поэтому execve не допускается.

1 Ответ

7 голосов
/ 02 июля 2011

Это основные шаги:

  1. Прочитайте заголовки программы, чтобы найти директивы LOAD и определить общую длину отображений, которые вам понадобятся, в страницах.
  2. Отобразите картудиректива LOAD с самым низким адресом с общей длиной (которая может быть больше длины файла), позволяющая mmap назначить вам адрес.Это зарезервирует смежное виртуальное адресное пространство.
  3. Отобразите директивы LOAD с напоминанием поверх частей этого отображения, используя MAP_FIXED.
  4. Используйте заголовки программы, чтобы найти вектор DYNAMIC, которыйв свою очередь даст вам адрес вектора (ов) перемещения.
  5. Примените перемещение.Предполагая, что ваш двоичный файл представляет собой статически связанный двоичный файл PIE, он должен состоять полностью из RELATIVE перемещений (просто добавление адреса базовой загрузки), что означает, что вам не нужно выполнять какие-либо поиски символов или что-либо необычное.

    Построить стек записи ELF-программы, состоящий из следующей последовательности значений размером с системное слово в массиве в стеке:

    ARGC ARGV[0] ARGV[1] ... ARGV[ARGC-1] 0 ENVIRON[0] ENVIRON[1] ... ENVIRON[N] 0 0
    
  6. (для этого шага требуется ASM!)Наведите указатель стека на начало этого массива и перейдите к адресу точки входа загруженной программы (который можно найти в заголовках программы).

...