Понимание раздела SHT_NOTE ".note.ABI-tag" для ELF - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь понять исполняемый файл Linux ELF. Я написал простую C программу "Hello World" и скомпилировал ее в исполняемый файл, используя G CC.

. Для "Заголовков разделов" я могу понять последний ".shstrtab" и второй ". interp ", потому что есть только некоторые смещения, позволяющие мне выяснить, к чему это относится.

Но для заголовка раздела" .note.ABI-tag "я просто запутался.

Содержание, перечисленное ниже, взято из моего исполняемого файла HelloWorld:

...
00000230  01 00 00 00 00 00 00 00  2f 6c 69 62 36 34 2f 6c  |......../lib64/l|
00000240  64 2d 6c 69 6e 75 78 2d  78 38 36 2d 36 34 2e 73  |d-linux-x86-64.s|
00000250  6f 2e 32 00 04 00 00 00  10 00 00 00 01 00 00 00  |o.2.............| <-- (5) start at 0x0254 (value: "0x04")
00000260  47 4e 55 00 00 00 00 00  03 00 00 00 02 00 00 00  |GNU.............|
00000270  00 00 00 00 04 00 00 00  14 00 00 00 03 00 00 00  |................| <-- (6) end at 0x0274 (note included)
00000280  47 4e 55 00 42 5c e5 58  cc 7b 78 91 e0 e1 b0 9a  |GNU.B\.X.{x.....|
00000290  3d 09 5b 6a 03 c1 7c bb  01 00 00 00 01 00 00 00  |=.[j..|.........|
000002a0  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000002b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
000022a0  72 54 4d 43 6c 6f 6e 65  54 61 62 6c 65 00 00 2e  |rTMCloneTable...|
000022b0  73 79 6d 74 61 62 00 2e  73 74 72 74 61 62 00 2e  |symtab..strtab..|
000022c0  73 68 73 74 72 74 61 62  00 2e 69 6e 74 65 72 70  |shstrtab..interp|
000022d0  00 2e 6e 6f 74 65 2e 41  42 49 2d 74 61 67 00 2e  |..note.ABI-tag..| <-- (3) name starts at 0x22d1
000022e0  6e 6f 74 65 2e 67 6e 75  2e 62 75 69 6c 64 2d 69  |note.gnu.build-i|
000022f0  64 00 2e 67 6e 75 2e 68  61 73 68 00 2e 64 79 6e  |d..gnu.hash..dyn|
...
00002440  00 00 00 00 00 00 00 00  23 00 00 00 07 00 00 00  |........#.......| <-- (2) sh_name offset is 0x23
00002450  02 00 00 00 00 00 00 00  54 02 40 00 00 00 00 00  |........T.@.....|
00002460  54 02 00 00 00 00 00 00  20 00 00 00 00 00 00 00  |T....... .......| <-- (4) sh_offset = 0x0254, sh_size = 0x20
00002470  00 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00  |................|
00002480  00 00 00 00 00 00 00 00  31 00 00 00 07 00 00 00  |........1.......|

...
00002b00  00 00 00 00 00 00 00 00  11 00 00 00 03 00 00 00  |................|
00002b10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00002b20  ae 22 00 00 00 00 00 00  19 01 00 00 00 00 00 00  |."..............| <-- (1).shstrtab starts at 0x22ae
00002b30  00 00 00 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
00002b40  00 00 00 00 00 00 00 00  (end of the file)        |........|
00002b48

Я могу понять, что:

  • В позиции (1) (в заголовок раздела ".shstrtab") показывает, что .shstrtab начинается с 0x22ae
  • В позиции (2) он показывает, что смещение sh_name этого раздела составляет 0x23
  • , поэтому я могу найти его sh_name в позиции (3) (0x22ae + 0x23 = 0x22d1), это «.note.ABI-tag»
  • В позиции (4) он показывает, что sh_offset равен 0x0254, тогда как sh_size равен 0x20
  • Так что я можно найти содержимое от 0x0254 до 0x0274 (не включено) (0x0254 + 0x20 = 0x0274)

И это все информацию, которую я могу найти.

Но я не могу понять:

, почему мой анализатор ELF сказал мне, что он может найти больше информации:

Note Segment (offset=0x254, size=32)
    Name="GNU"
    Type=1
    Type String="NT_GNU_ABI_TAG"
    Description="OS Linux 3.2.0"

Где эти ключ и значения берутся? Как я могу найти его вручную?

Статьи в Интернете, кажется, не помогают:

Я искал некоторые статьи, и, возможно, эта является самой подробной: https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-18048.html

Но я до сих пор не могу понять суть.

Например, он говорит: «каждая запись - это массив 4-байтовых слов в формате цели процессор ", так что кажется, что я должен разделить байты между 0x0254 (включены) и 0x0274 (не включены) в 8" 4-байтовое слово ", которое должно быть:

1st word: 04 00 00 00
2nd word: 10 00 00 00
3rd word: 01 00 00 00
4th word: 47 4e 55 00
5th word: 00 00 00 00
6th word: 03 00 00 00
7th word: 02 00 00 00
8th word: 00 00 00 00

Тогда он говорит:« Первый байты namesz в имени содержат символьное представление с нулем в конце владельца или отправителя записи. "

Но в 1-м" 4-байтовом слове "" 0x04 ", оканчивающееся на" 0x00 ", не является печатным символом но управляющий символ ASCII «Конец передачи».

Так что в основном вопрос, как я могу вручную найти из двоичного файла информацию, отображаемую анализатором ELF?

1 Ответ

2 голосов
/ 06 января 2020

Извлечение из эльфа (5) раздела Примечания (Nhdr) Я смог определить:

1st word: 04 00 00 00 - n_namesz - the name of the name field in bytes. It is 4 - "GNU"
2nd word: 10 00 00 00 - n_descsz - The length of the descriptor field in bytes.
3rd word: 01 00 00 00 - n_type - The NT_GNU_ABI_TAG label (or ELF_NOTE_ABI or similar)
4th word: 47 4e 55 00 - "GNU" with zero terminator
5th word: 00 00 00 00 - OS descriptor - ELF_NOTE_OS_LINUX,
6th word: 03 00 00 00 - major version of the ABI
7th word: 02 00 00 00 - minor version of the ABI
8th word: 00 00 00 00 - subminor version of the ABI
...