Какое расстояние между [ELF Header] и [сегмент данных]? - PullRequest
0 голосов
/ 02 февраля 2019

Я скомпилировал очень очень простой ассемблерный код с nasm и ld под Linux (CentOS6 32bit).

nasm -f elf -o basic1.o basic1.asm
ld -o basic1 basic1.o
cat basic1.asm
;---------------------------------------
section .data

msg     db      'hello world', 10, 00

section .bss
tests   resd    100

segment .text
global _start

_start:

И я выполняю objdump с опцией -x.

basic1:     file format elf32-i386
basic1
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048060

Program Header:
    LOAD off    0x00000000 vaddr 0x08049000 paddr 0x08049000 align 2**12
         filesz 0x00000061 memsz 0x000001f4 flags rw-

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .data         0000000d  08049054  08049054  00000054  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  1 .bss          00000190  08049064  08049064  00000061  2**2
                  ALLOC
  2 .comment      0000001f  00000000  00000000  00000061  2**0
                  CONTENTS, READONLY
SYMBOL TABLE:
08049054 l    d  .data  00000000 .data
08049064 l    d  .bss   00000000 .bss
00000000 l    d  .comment       00000000 .comment
00000000 l    df *ABS*  00000000 basic1.asm
08049054 l       .data  00000000 msg
08049064 l       .bss   00000000 tests
08048060 g       .data  00000000 _start
08049061 g       *ABS*  00000000 __bss_start
08049061 g       *ABS*  00000000 _edata
080491f4 g       *ABS*  00000000 _end

Согласно описанию Википедии, файловая структура ELF имеет заголовок размером 0x34 в 32-разрядной среде.

А вывод моего скомпилированного кода сборки имеет сегмент данных в позиции 0x54.

Итак, какой код находится между 0x35 и 0x53?

Когда я увидел содержимое с помощью команды xxd, я получил следующие результаты.Что означает этот результат?

0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 0300 0100 0000 6080 0408 3400 0000  ........`...4...
0000020: b000 0000 0000 0000 3400 2000 0100 2800  ........4. ...(.
0000030: 0700 0400 0100 0000 0000 0000 0090 0408  ................
0000040: 0090 0408 6100 0000 f401 0000 0600 0000  ....a...........
0000050: 0010 0000 6865 6c6c 6f20 776f 726c 640a  ....hello world.
0000060: 0000 5468 6520 4e65 7477 6964 6520 4173  ..The Netwide As
0000070: 7365 6d62 6c65 7220 302e 3939 2e30 3500  sembler 0.99.05.
0000080: 002e 7379 6d74 6162 002e 7374 7274 6162  ..symtab..strtab
0000090: 002e 7368 7374 7274 6162 002e 6461 7461  ..shstrtab..data
00000a0: 002e 6273 7300 2e63 6f6d 6d65 6e74 0000  ..bss..comment..
00000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000d0: 0000 0000 0000 0000 1b00 0000 0100 0000  ................
00000e0: 0300 0000 5490 0408 5400 0000 0d00 0000  ....T...T.......
00000f0: 0000 0000 0000 0000 0400 0000 0000 0000  ................
0000100: 2100 0000 0800 0000 0300 0000 6490 0408  !...........d...
0000110: 6100 0000 9001 0000 0000 0000 0000 0000  a...............
0000120: 0400 0000 0000 0000 2600 0000 0100 0000  ........&.......
0000130: 0000 0000 0000 0000 6100 0000 1f00 0000  ........a.......
0000140: 0000 0000 0000 0000 0100 0000 0000 0000  ................
0000150: 1100 0000 0300 0000 0000 0000 0000 0000  ................
0000160: 8000 0000 2f00 0000 0000 0000 0000 0000  ..../...........
0000170: 0100 0000 0000 0000 0100 0000 0200 0000  ................
0000180: 0000 0000 0000 0000 c801 0000 b000 0000  ................
0000190: 0600 0000 0700 0000 0400 0000 1000 0000  ................
00001a0: 0900 0000 0300 0000 0000 0000 0000 0000  ................
00001b0: 7802 0000 3500 0000 0000 0000 0000 0000  x...5...........
00001c0: 0100 0000 0000 0000 0000 0000 0000 0000  ................
00001d0: 0000 0000 0000 0000 0000 0000 5490 0408  ............T...
00001e0: 0000 0000 0300 0100 0000 0000 6490 0408  ............d...
00001f0: 0000 0000 0300 0200 0000 0000 0000 0000  ................
0000200: 0000 0000 0300 0300 0100 0000 0000 0000  ................
0000210: 0000 0000 0400 f1ff 0c00 0000 5490 0408  ............T...
0000220: 0000 0000 0000 0100 1000 0000 6490 0408  ............d...
0000230: 0000 0000 0000 0200 1600 0000 6080 0408  ............`...
0000240: 0000 0000 1000 0100 1d00 0000 6190 0408  ............a...
0000250: 0000 0000 1000 f1ff 2900 0000 6190 0408  ........)...a...
0000260: 0000 0000 1000 f1ff 3000 0000 f491 0408  ........0.......
0000270: 0000 0000 1000 f1ff 0062 6173 6963 312e  .........basic1.
0000280: 6173 6d00 6d73 6700 7465 7374 7300 5f73  asm.msg.tests._s
0000290: 7461 7274 005f 5f62 7373 5f73 7461 7274  tart.__bss_start
00002a0: 005f 6564 6174 6100 5f65 6e64 00         ._edata._end.

Кроме того, что означает код после 0x80, в котором заканчивается сегмент комментария?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Это заголовок программы , также описанный в Википедии.

Элемент e_phoff заголовка ELF (смещение файла 0x1C) имеет значение 0x34, имеется e_phnum (смещение файла 0x2C) или 1 запись (читай: сегменты), поэтому заголовок программы заканчивается со смещением0x54.

Помимо программы и заголовка файла имеется также заголовок раздела, начиная с e_shoff (смещение файла 0x20) или 0xb0, содержащий 7 записей (смещение файла 0x30) и заканчивая смещением 0x1c8.
Большинство этих разделов не отображаются readelf по умолчанию .

Вы обнаружите, что запись в индексе 4 (смещение 0x150) предназначена для таблицы String , начиная со смещения 0x80 (см. Значение в 0x160) и размера 0x2e (см. Значение в 0x164).
Таким образом, в 0x80 есть строки, используемые самой структурой ELF.

0 голосов
/ 02 февраля 2019

Вы можете получить более подробную информацию о том, как разделы размещаются в вашем ELF с помощью readelf -S <your_file>.Затем вы можете увидеть еще несколько разделов перед .data, например

  • пустой раздел с размером 0 при 0 выравнивании
  • .text раздел, в котором хранится код
  • .data где хранятся данные
  • ...

есть также несколько разделов отладки, таких как:

  • .shstrtab -Таблица строк заголовка раздела, в которой просто хранятся имена других разделов, таблица символов
  • в .symtab,
  • .strtab, где хранятся метки (строки) из вашего кода сборки

Как размещаются разделы, контролируется сценарием компоновщика ld, который вы можете написать вручную, чтобы разместить разделы с большей точностью.

Вы также можете удалить эти разделы отладки с помощью strip -R symtab <your_file>, но вы не можете удалить .shstrtable, так как он генерируется после связывания файла.Также не забывайте, что разделы выровнены и между ними могут быть некоторые «дыры».

Итак, на оба ваших вопроса можно ответить после того, как вы прочитаете файл с readelf и затем сопоставите его со спецификацией ELF.

И мои предположения следующие:

Так как где-то должен быть раздел, содержащий имена других разделов (.shstrtab), я думаю, это то, что вы видите в 0x80:

0000080: 002e 7379 6d74 6162 002e 7374 7274 6162  ..symtab..strtab
0000090: 002e 7368 7374 7274 6162 002e 6461 7461  ..shstrtab..data
00000a0: 002e 6273 7300 2e63 6f6d 6d65 6e74 0000  ..bss..comment..

И есть еще один раздел перед .data (до 0x53), который вы увидите позже

...