#c #binary #g
#c #двоичный #g
Вопрос:
Я хочу заметить разницу в двоичном выводе кода операционной системы при компиляции между двумя версиями очень простой программы на C . Например, 2 2 = ?, без вызова библиотек. Я ожидал, что скомпилированный результат будет крошечным файлом двоичных операционных кодов с несколькими небольшими заголовками, которые являются новыми для скомпилированных программ, но есть большие заголовки.
simple.cpp
int main()
{
unsigned int a = 2;
unsigned int b = 2;
unsigned int c = a b;
}
компилятор:
g -std=c 0x simple.cpp -o simple
Есть ли формат, в который я могу экспортировать, который не содержит заголовков, только двоичный код операционной системы, который мы инструктируем машине выполнить? Если нет, то какие байты или местоположение в результирующем файле я могу искать, чтобы изолировать соответствующую логику от программы?
Мне нужен машинный код, а не сборка, поскольку мой проект представляет собой анализ по-разному запутанных версий исходного файла, чтобы попытаться распознать одну на основе другой. Сложная тема с сомнительной выполнимостью, но, тем не менее, именно поэтому я прошу изолировать машинный код, а не только сборку — для проверки анализа на соответствие выводам истинного машинного кода.
Я попытался погуглить структуру заголовка, но, похоже, не могу найти много информации.
Комментарии:
1. Одним из быстрых способов может быть использование онлайн-компилятора и просто просмотр окна сборки: godbolt.org/z/Wqvrch
2. @TedLyngmo Вне таблицы к сожалению, код пишется в системе с воздушным зазором: 3 Выполняю побочный проект на работе, и моя машина с доступом в Интернет не настроена для кодирования.
3.
g -masm=intel -S -std=c 0x simple.cpp -o-
должно отображаться что-то очень похожее на то, что вы увидите в godbolt.4. обратите внимание, что компиляторы не являются глупыми машинами для перевода 1: 1. Как только вы включите оптимизацию, все ваше целое
main
будет преобразовано в NOOP, потому что нет наблюдаемого поведения. Либо вы включаете оптимизацию, тогда вы не увидите того, что ожидаете, либо нет, тогда то, что вы можете заключить из своих выводов, имеет ограниченное применение5. Обфускаторы @MSalters захотят добавить, среди прочего, мертвый код, чтобы скрыть свою подпись, и, вероятно, избыточные
goto
s, оба из которых, похоже, компилятор, использующий оптимизацию, быстро удалит. Я не понимаю, почему вы говорите, что оптимизированный код не нуждается в запутывании. Если злоумышленник отправит вам полезную нагрузку, и она оптимизирована, без обфускации вы легко распознаете эту полезную нагрузку в своих идентификаторах при следующей попытке атаки.. Оптимизация противоположна запутыванию, она делает результирующий двоичный файл более предсказуемым и более сложным для осмысленного изменения.
Ответ №1:
Просматривая ld(1): GNU linker — справочную страницу Linux, вы обнаружите, что вы можете использовать --oformat=output-format
option для указания формата вывода.
binary
это формат, в котором нет заголовков.
Затем, увидев gcc (1): GNU project C / C compiler — справочную страницу Linux, вы обнаружите, что вы можете использовать -Wl
option для передачи параметров компоновщику. -nostdlib
опция также полезна, чтобы избежать добавления дополнительных вещей.
Объединив их, вы можете попробовать эту команду:
g -std=c 0x simple.cpp -nostdlib -Wl,--oformat=binary -o simple
Комментарии:
1. Тоже не
-S
нужно?2. @TedLyngmo Да, это было. Без этого я фактически получаю много буферного пространства, заполненного 0
3. @J.Todd Хорошо, я добавил это. Надеюсь, ты не возражаешь, Майк.
4. @TedLyngmo исходный код сборки (текст) выводится вместо двоичного файла с опцией
-S
. Откат. Вы имеете в виду-s
(маленькийs
)?5. @MikeCAT О, нет, я, должно быть, неправильно понял вопрос и подумал, что OP хочет текст.