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

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

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

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

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

Спасибо,

9
задан Community 23 May 2017 в 02:30
поделиться

1 ответ

Загрузчик 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
$

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

11
ответ дан 3 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: