Создайте два разных двоичных файла с одинаковым размером и одинаковым хешем md5

У меня есть два разных файла: code1.c и code2.c, оба они уже содержат некоторый код C (содержимое файлов различается).

Я хотел бы скомпилировать оба файла предпочтительно с одинаковыми флагами компиляции, поэтому я получу два двоичных файла, которые будут иметь одинаковый размер и одинаковый хэш md5.

Примечание. Допускается добавление лишнего мертвого / нежелательного кода в один из файлов. Думаю, gcc версия компилятора не имеет значения? (Я бы использовал gcc version ≥ 7)

Как я могу этого добиться?


Я нашел несколько статей, которые показывают, что конфликт хэша md5 возможен, но проблема в том, что это должно привести к тому же размеру файла:


person Awaaaaarghhh    schedule 24.04.2020    source источник
comment
Хотя решение есть, маловероятно, что вы сможете найти его на практике. Достаточно сложно найти хэш-коллизию, когда вы можете произвольно изменять один ввод - это основная точка хеширования, - но вы даже не можете этого сделать, поскольку входы в ваш MD5 - это выходы из компилятора. На самом деле возможно, что нет решения с учетом вашей отправной точки и ограничений.   -  person John Bollinger    schedule 25.04.2020
comment
@JohnBollinger Было бы проще, если бы я сказал, что скомпилирую без какой-либо оптимизации?   -  person Awaaaaarghhh    schedule 25.04.2020
comment
Нет, не особо.   -  person John Bollinger    schedule 25.04.2020
comment
@JohnBollinger, а что, если одинаковым должен быть только хеш md5 (компилировать без оптимизации, размер файла может быть другим). Это чем выполнимо? Например. учитывая md5 hash файла binary1 и исходный код code2.c, где скомпилированный code2.c (binary2) должен иметь тот же md5 hash, что и файл binary1?   -  person Awaaaaarghhh    schedule 25.04.2020
comment
Вторая ссылка, которую вы разместили, именно то, что вы ищете.   -  person Marco Bonelli    schedule 25.04.2020
comment
@JohnBollinger, вы можете добавить мертвый код в уже скомпилированные двоичные файлы (желательно в начале файла), что определенно предоставит решение, возможно, даже довольно быстро.   -  person Marco Bonelli    schedule 25.04.2020
comment
@MarcoBonelli, похоже, что это не соответствует ограничениям, изложенным в ОП. Я прочитал OP, чтобы сказать, что двоичные файлы , созданные компилятором, должны иметь один и тот же хэш (не говоря уже о том, что они одинакового размера). Я считаю, что комментарий о добавлении мусора в один из файлов относится к исходным файлам, а не к результирующим двоичным файлам.   -  person John Bollinger    schedule 25.04.2020
comment
@MarcoBonelli, я бы хотел, чтобы md5-file-hash из скомпилированного code2.c (binary2) был точно таким же, как md5-file-hash из binary1. Мне не ясно, как я могу адаптировать решение из второй ссылки (natmchugh.blogspot.com) к моему вопросу. Вы можете мне намекнуть? ... или лучше напишите полный ответ?   -  person Awaaaaarghhh    schedule 25.04.2020
comment
В результирующий двоичный файл @JohnBollinger также может быть добавлен какой-то мусор (добавлены только некоторые NOPs коды opt ... или что-то подобное), если это сработает, это тоже будет нормально ...   -  person Awaaaaarghhh    schedule 25.04.2020
comment
ДжонБоллингер прав в том, что ваш вопрос, похоже, указывает на то, что вы будете ограничены только изменением исходного кода перед компиляцией. Это, вероятно, сделало бы вещи невозможными. Единственный способ выполнить эту работу - изменить двоичные файлы после компиляции, и, как я уже сказал, вторая опубликованная вами ссылка делает именно это: она добавляет бесполезную переменную в код, затем компилирует ее и предварительно вычисляет состояние MD5 до переменной, затем подбирает необходимое значение переменной, необходимое для возникновения коллизии.   -  person Marco Bonelli    schedule 25.04.2020
comment
Как насчет добавления таких больших кусков к вашим функциям? asm volatile("jmp foo\n#a bunch of asm-encoding of arbitrary binary stuff here\nfoo:": : :) Это дает вам практически прямой доступ к середине двоичного файла из источника.   -  person Joseph Sible-Reinstate Monica    schedule 25.04.2020