Я пытаюсь понять исполняемый файл 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?