ELF файл вручную - PullRequest
       5

ELF файл вручную

9 голосов
/ 23 августа 2010

Эй, я создал файл ELF вручную, он имеет два раздела (.text и .shstrtab) и программный заголовок, который загружает раздел .text.Раздел .text очень маленький и состоит только из следующих трех инструкций ...

    # and exit
    movl    $0,%ebx       # first argument: exit code
    movl    $1,%eax       # system call number (sys_exit)
    int     $0x80         # call kernel

readelf не жалуется, когда я запускаю его на этом файле эльфа.Если я прошу прощения за этот файл, то, как только я его выполню, он будет убит, и на экране появится сообщение «Убито».Я прочитал следующий пост здесь на stackoverflow , и я все еще прохожу его.

Теперь меня беспокоит то, что эта программа не запрашивает какую-либо (дополнительную) память, а также действительно ли можно сделать ELF вручную и ожидать, что система вообще допустит его?

Спасибо,

Ответы [ 2 ]

11 голосов
/ 24 августа 2010

Загрузчик ELF может отправить SIGKILL в ваш процесс по разным причинам; у вас, вероятно, неправильный адрес и / или длина где-то в заголовках.

например. сегмент PT_LOAD должен отображать соответствующую часть исполняемого файла на разумный адрес (обычный адрес для x86 Linux - 0x08048000, хотя это, вероятно, не критично, если он выровнен по страницам, а не 0 и не слишком высок) и адреса как в заголовке секции .text, так и в точке входа в заголовке ELF должны совпадать с этим.

Нет никаких причин, по которым вы не сможете сделать это вручную (если компоновщик может создать его, вы тоже можете!) - если вы действительно этого хотите. Но учтите, что если вы просто соберете, то ссылка с символами будет удалена (флаг -s на ld ниже):

$ cat exit.s
.globl _start
_start:
 movl $0,%ebx
 movl $1,%eax
 int $0x80
$ as -o exit.o exit.s
$ ld -s -o exit exit.o
$ ./exit
$ hexdump -Cv exit
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  54 80 04 08 34 00 00 00  |........T...4...|
00000020  74 00 00 00 00 00 00 00  34 00 20 00 01 00 28 00  |t.......4. ...(.|
00000030  03 00 02 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000040  00 80 04 08 60 00 00 00  60 00 00 00 05 00 00 00  |....`...`.......|
00000050  00 10 00 00 bb 00 00 00  00 b8 01 00 00 00 cd 80  |................|
00000060  00 2e 73 68 73 74 72 74  61 62 00 2e 74 65 78 74  |..shstrtab..text|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000090  00 00 00 00 00 00 00 00  00 00 00 00 0b 00 00 00  |................|
000000a0  01 00 00 00 06 00 00 00  54 80 04 08 54 00 00 00  |........T...T...|
000000b0  0c 00 00 00 00 00 00 00  00 00 00 00 04 00 00 00  |................|
000000c0  00 00 00 00 01 00 00 00  03 00 00 00 00 00 00 00  |................|
000000d0  00 00 00 00 60 00 00 00  11 00 00 00 00 00 00 00  |....`...........|
000000e0  00 00 00 00 01 00 00 00  00 00 00 00              |............|
000000ec
$

... тогда результат в любом случае будет минимальным (вероятно, достаточно минимальным для сравнения с вашим ошибочным файлом, созданным вручную, чтобы увидеть, в чем вы ошиблись).

0 голосов
/ 06 июня 2012

В последнее время я также пытаюсь проводить аналогичные эксперименты.
Во время процесса я также получаю информацию об ошибке при запуске сгенерированного файла elf, похоже,
является результатом неправильной установки viraddr и размещения сегментов.Отправьте свой собственный
файл эльфа с помощью стандартного файла эльфа (скомпилированного и связанного).
Кстати, для простоты стандартного файла эльфа a.out вы можете использовать параметр -s
удалить таблицы символов в файле эльфа: ld -s ao

...