Содержат ли исполняемые файлы, созданные с помощью GCC, идентифицируемые метаданные? - PullRequest
0 голосов
/ 22 июня 2019

Например, файлы PDF могут содержать метаданные, которые были включены программным обеспечением для создания / изменения PDF по умолчанию или по собственному выбору пользователя. Среди прочего, метаданные могут отображать используемое программное обеспечение для создания PDF и имя пользователя, создавшего PDF.

  • Когда создается исполняемый файл с использованием GCC, содержит ли исполняемый файл какие-либо метаданные (используемый компилятор, дата компиляции и т. Д.)?
  • Как можно намеренно вставлять метаданные в исполняемый файл? (например, имя автора, дата создания, используемые флаги компилятора, хэш коммита VCS и т. д.)

Примечание: метаданные, о которых я говорю, не обязательно должны быть "стандартными" (то есть, как в случае с PDF). Так или иначе, он просто должен быть виден человеку, осматривающему исполняемый файл.

1 Ответ

0 голосов
/ 22 июня 2019
  • GCC записывает свою версию в разделе .comment (по крайней мере, для целей, которые ее поддерживают - например, для ELF). Вы можете что-то скомпилировать и проверить с помощью objdump -s -j .comment a.out.

  • -frecord-gcc-switches (см. Руководство и этот ответ )

  • -grecord-gcc-switches

  • Обычно, когда вы просите компилятор выдавать отладочную информацию (семейство опций -g*), может быть выдано много мета-информации. Мне известны теги DW_AT_producer (информация об имени и версии компилятора / ассемблера, а также переключатели командной строки) и теги DW_AT_comp_dir (каталог компиляции).

Есть также -fverbose-asm, но он генерирует только комментарии в сборке; они не доходят даже до объектных файлов, не говоря уже о исполняемых файлах.

Также имейте в виду, что компилятор не создает исполняемые файлы. Он просто создает код ассемблера (команда gcc - это драйвер компилятора , который вызывает собственно компилятор , затем ассемблер, затем компоновщик). Компоновщик может решить, что делать с разделами .comment и т.п. при объединении объектных файлов в исполняемый файл / библиотеку. Я думаю, что «нормальным» поведением является их катинизация, хотя отказ от них на этом этапе или позже (например, с strip) никого не должен удивлять.

Как сознательно вставить метаданные в исполняемый файл?

Обычно для этого используются секции SHT_NOTE (если мы говорим на ELF). Здесь объединение и сохранение до конца гарантированы, потому что они не просто комментарии; они используются набором инструментов для хранения некоторых свойств программ (см. man elf, grep для «примечания»).

Другой (хакерский) способ - определение абсолютных символов. Вы можете закодировать информацию в названии символа. Это можно сделать на любом этапе. Например. в исходной программе или в сборке. Или на этапе соединения с ld --defsym. Или вы можете изменить полученный исполняемый файл с помощью objcopy --add-symbol - о, это работает и для разделов (objcopy --add-section).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...