Недавно я сделал дамп строк памяти (просто потому, что мог) с помощью sudo cat /dev/mem | strings
. Просмотрев этот дамп, я заметил несколько очень интересных вещей:
.symtab
.strtab
.shstrtab
.note.gnu.build-id
.rela.text
.rela.init.text
.rela.text.unlikely
.rela.exit.text
.rela__ksymtab
.rela__ksymtab_gpl
.rela__kcrctab
.rela__kcrctab_gpl
.rela.rodata
.rodata.str1.8
.rela__mcount_loc
.rodata.str1.1
.rela__bug_table
.rela.smp_locks
.modinfo
__ksymtab_strings
.rela__tracepoints_ptrs
__tracepoints_strings
__versions
.rela.data
.data.unlikely
.rela__verbose
.rela__jump_table
.rela_ftrace_events
.rela.ref.data
.rela__tracepoints
.rela.gnu.linkonce.t6
Кажется, что все эти строки каким-то образом связаны: все они (очень) близки друг к другу в памяти, все они имеют похожие .<name>
префиксы, и все они, кажется, ссылаются друг на друга.
Что могло стать причиной появления этих строк и почему?
решение1
+1 к тому, что сказал @jos выше («погуглите»). В этом конкретном случае вам следует удалить части «.rela_» и «_gpl». Вы обнаружите, что это символы ядра. «rela» — это аббревиатура от «relocation» и связано с форматом файла ELF. Все это интересные темы, и я рекомендую вам изучить их подробнее.
решение2
Они очень похожи на имена разделов из ядра Linux. Те, которые имеют префикс .rela, содержат информацию о перемещении для указанного раздела, например, .rela.text — это информация о перемещении для текстового раздела (где хранится код объекта ядра).
Другие разделы, представляющие интерес:
- .modinfo - информация о модуле ядра
- .rela.__ksymtab - таблица перемещений таблицы символов ядра
- .rela.data - таблица перемещения раздела данных ядра
- rodata.str1.1 - раздел данных только для чтения для строк
и так далее.
Запуск strings на /dev/mem найдет только интересные строки в физической памяти системы; следовательно, вам удалось найти некоторые строки, которые находятся в несжатом ядре vmlinuz Linux.