Забавляемся с хешами
Время прочтения
5 мин
Просмотры 82K
Привет. Я хочу показать вам небольшой фокус. Для начала вам потребуется скачать архив с двумя файлами. Оба имеют одинаковый размер и одну и ту же md5 сумму. Проверьте никакого обмана нет. Md5 хеш обоих равен ecea96a6fea9a1744adcc9802ab7590d. Теперь запустите программу good.exe и вы увидите на экране следующее.
Попробуйте запустить программу evil.exe.
Что-то пошло не так? Хотите попробовать сами?
О хешах и колллизиях
На самом деле ничего нового во всем этом нет. В действительности данный эффект достигается за счет методов быстрого поиска коллизий для хеш функции разработанных еще в 2004-2006 годах. Если кто не знает, коллизия это два разных набора данных, имеющих одно и тоже хеш-значение. Так вот, в 2004 году группа китайских исследователей разработала алгоритм, основанный на дифференциальном криптоанализе, позволяющий за относительно небольшое время находить два различных случайных блока данных, размером по 128 байт каждый, имеющих одну и ту же md5 сумму. И хотя алгоритм этот в свое время произвел эффект взорвавшейся бомбы быстродействие его оставляло желать лучшего. Но уже в 2006 году чешский криптограф Властимил Клима предложил для поиска коллизий новый метод, позволяющий найти разную пару случайных 128 байтных блоков с одной md5 суммой на персональном компьютере меньше чем за минуту.
Вы спросите, но что нам даст обладание такой парой сообщений, мало того что они короткие(всего 128 байт), так еще, в добавок, и случайные, т.е. метод не позволяет для заданного сообщения подобрать другое, с идентичным хешем. Однако это открывает огромный простор для различного рода атак на выполняемые файлы. И виной тому служит следующая особенность работы любой хеш функции: Хеш функция по своей природе итеративна. Это означает, что при подсчете хеша сообщение разбивается на блоки, к каждому блоку применяется функция сжатия, зависящая от некоторой переменной, называемой вектор инициализации. Результат этой функции будет являться вектором инициализации для следующего блока. Результат функции после работы с последним блоком и будет окончательным хеш значением нашего сообщения.
Схематично это можно представить следующим образом:
si+1 = f(si, Mi), где si вектор инициализации для i-го блока.
Метод Властимила Клима позволяет для любого заданного значения si подобрать два 128-байтных блока M,M` и N,N` таких, что f(f(s, M), M’) = f(f(s, N), N’).
Таким образом, с помощью данной методики можно сконструировать два файла с одинаковой md5 суммой, но имеющих различные 128 байт в середине.
M0, M1, …, Mi-1, Mi, Mi+1, Mi+2, …, Mn,
M0, M1, …, Mi-1, Ni, Ni+1, Mi+2, …, Mn.
Обратите внимание что хеши обоих этих файлов совпадут, т.к. различающиеся блоки Mi, Mi+1 и
Ni, Ni+1 вернут в качестве si+2 одно и тоже значение, т.к. f(f(s, Mi), Mi+1) = f(f(s, Ni), Ni+1), а поскольку все последующие данные идентичны то последующие значения функции сжатия для обоих файлов будут совпадать.
Что это нам дает
Теперь перейдем от вещей абстрактных и отдаленных к вопросу практическому. Предположим, что у нас есть исполняемый файл M0, M1, X, X, …, Mn. Но его основе мы можем создать два разных файла M0, M1, N1, N1, …, Mn и M0, M1, N2, N1,…, Mn(просто меняем блоки X на N1 и N2). Если блоки N1 и N2 – это коллизии то хеш-сумма этих файлов будет совпадать.
Теперь представим, что этот исполняемый файл имеет следующую структуру:
if (X == X) then { good_program } else { evil_program }
Вот собственно и весь секрет данного фокуса.
Как сделать самостоятельно
Теперь немного поговорим о том как это сделать самому.
Шаг первый: пишем программу с двойным дном.
#include <stdafx.h>
#include<iostream>
#include <string>
using namespace std;
//переменные str1 и str2 в данном примере являются теми самыми элементами X.
static char *str1="qwertyuioplkjhgfdaszxcvbnmkjhgfdsaqwertyuikjh"
"gbvfdsazxdcvgbhnjikmjhbgfvcdsazxdcfrewqikolkjnhgfqwertyuioplkjh"
"gfdaszxcvbnmkjhgfdsaqwertyuikjhgbvfdsazxdcvgbhnjikmjhbgfvcdsa"
"zxdcfrewqikolkjnhgfq123";
static char *str2="qaswderftgyhujikolpmnbvcxzasxdcfvgbhnjmkijuy"
"gtfdeswaqscfvgyjqaswderftgyhujikolpmnbvcxzasxdcfvgbhnjmkijuyg"
"tfdeswaqscfvgyjqaswderftgyhujikolpmnbvcxzasxdcfvgbhnjmkijuygt"
"fdeswaqscfvgyjqwertyuikja2";int good()
{
int a;
std::cout<<"Good, nice programme!";
std::cin>>a;
return 0;
}
int bed()
{
int a;
for(int i=0; i<1000; i++)
{
std::cout<<"Evil, evil code!";
}
std::cin>>a;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
//строки s и s2 содержат только блоки с коллизиями без лишних элементов
string s=str1;
string s2=str2;
s.erase(0,56);
s.erase(128,8);
s2.erase(0,64);
if (s==s2) {
return good();
} else {
return bed();
}
return 0;
}
* This source code was highlighted with Source Code Highlighter.
Особое внимание прошу обратить на переменные str1 и str2. Они служат для того, чтобы их можно было быстро найти в hex-редакторе и заменить нужными данными.
Функция main в зависимости от содержимого переменных s вызывает хорошую или плохую версию программы.
Шаг второй: После компиляции программы нужно будет немного поработать с hex-редактором для того чтобы найти в .exe файле наши строки str1 и str2. Скопируй полученный .exe файл. Пусть копия будет называется «обрезанная версия». Откройте копию в hex-редакторе и найди в ней строки str1 и str2. Удалите все данные идущие после первых 64 байт первой из строк. Последние строки полученного файла будут выглядеть вот таким образом: . Сохраните данный файл.
Шаг третий: Созданный на втором шаге файл будет служить так называемым префиксом для поиска коллизий. Чтобы найти коллизию с заданным префиксом нужно скачать отсюда программу fastcoll(Спасибо ее автору Marc Stevens). Исходники лежат тут.
Запустите программу с параметром –p. В качестве префикса укажите «обрезанную версию». В результате работы программы будут созданы два файла «обрезанная версия_msg1» и «обрезанная версия_msg2».
Шаг четвертый: создайте еще одну копию вашей программы. Пусть оригинал будет называться good.exe, а копия evil.exe. Откройте файлы msg1 и msg2 в hex редакторе. Сперва замените блок в котором хранится str2 данными из блока str1. Пусть теперь в них будет одинаковая информация. После этого скопируйте из файла msg1 последние 128 байт и вставьте их в ваш good файл так как показано на рисунке.
Обратите внимание, отступы должны соответствовать следующим параметрам: первый блок вставляется прямо в том месте где заканчивается файл «обрезанная версия», второй блок располагается в 96 байтах от первого. Важно: блоки вставлять одни и те же. Это будет доброй версией нашей программы. Сохраняем файл good.exe и открываем файл evil.exe. Блоки в файл evil.exe нужно будет вставить в те же места, что и в good.exe, единственное отличие заключается в том, что первый блок мы берем из файла msg2, а второй из файла msg1. Это различие и обеспечит нам невыполнение условия программы if (s==s2) и соответственно запустит злую версию программы.
Шаг пятый: Profit! Сравниваем md5 суммы файлов, наслаждаемся полученным результатом.
Список литературы:
1. Замечательный сайт с описанием данного метода
2. Сайт Властимила Клима
3. Сайт автора программы findcoll
0 / 0 / 0 Регистрация: 26.07.2015 Сообщений: 16 |
|
1 |
|
20.02.2017, 00:30. Показов 9998. Ответов 13
Собственно, интересует, как изменить MD5 хеш-сумму видео файла? Если был бы текстовый файл, хватило бы добавить символ и хеш стал другой. Как быть с видео? Если можно, не только теорию, но и код. Ну, а вообще, за любую помощь буду благодарен.
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
20.02.2017, 00:30 |
Ответы с готовыми решениями: md5 хеш файла
Не верный хеш md5 Как получить MD5-хеш файла 13 |
82 / 82 / 39 Регистрация: 17.02.2016 Сообщений: 464 |
|
20.02.2017, 00:40 |
2 |
post4ok, видео — определенный тип файлаконтейнер
0 |
0 / 0 / 0 Регистрация: 26.07.2015 Сообщений: 16 |
|
20.02.2017, 00:48 [ТС] |
3 |
HiredKiller, не совсем понял, можно какой-то пример? Что/куда и т.д.
0 |
1039 / 855 / 335 Регистрация: 08.12.2016 Сообщений: 3,283 |
|
20.02.2017, 01:30 |
4 |
Что это ты должен сказать, для начала, что у тебя за видео-файл
0 |
0 / 0 / 0 Регистрация: 26.07.2015 Сообщений: 16 |
|
20.02.2017, 01:46 [ТС] |
5 |
YuryK, любой видео файл. К примеру, формата .avi
0 |
1039 / 855 / 335 Регистрация: 08.12.2016 Сообщений: 3,283 |
|
20.02.2017, 01:55 |
6 |
все под одну гребенку не причешешь. а контейнера avi один формат, у mkv — другой, и т.д. подумай спецификации каждого и смотри куда можно «добавить байты», не повредив работоспособность. З.Ы. Навскидку, лишний байт в конце файла, по идее не должен сказаться вообще, т.к. видео можно воспроизводить и из «недокачанного» файла, поэтому все важное о размере и составе контейнера хранится в заголовке, ИМХО.
0 |
0 / 0 / 0 Регистрация: 26.07.2015 Сообщений: 16 |
|
20.02.2017, 02:06 [ТС] |
7 |
YuryK, как допустим в .avi файл «добавить байты» через Delphi? Как вообще это реализовать?
0 |
пофигист широкого профиля 4602 / 3062 / 850 Регистрация: 15.07.2013 Сообщений: 17,669 |
|
20.02.2017, 02:51 |
8 |
Собственно, интересует, как изменить MD5 хеш-сумму видео файла? А нафига? Озвучь свою задачу.
0 |
5446 / 4270 / 1375 Регистрация: 14.04.2014 Сообщений: 19,210 Записей в блоге: 19 |
|
20.02.2017, 09:30 |
9 |
чтобы не палили правообладатели ))
2 |
0 / 0 / 0 Регистрация: 26.07.2015 Сообщений: 16 |
|
20.02.2017, 11:07 [ТС] |
10 |
northener, верно ответил за меня krapotkin. Я работаю в сфере файлообмена, в итоге, правообладатели ищут свои файлы по MD5 и абузят (жалуются/удаляют). Так как у меня свой софт по автоматизации данной деятельности, то нужно автоматизировать и смену MD5.
0 |
Модератор 8257 / 5480 / 2249 Регистрация: 21.01.2014 Сообщений: 23,584 Записей в блоге: 3 |
|
20.02.2017, 15:28 |
11 |
по автоматизации данной деятельности по автоматизации пиратства?
0 |
1039 / 855 / 335 Регистрация: 08.12.2016 Сообщений: 3,283 |
|
20.02.2017, 15:31 |
12 |
откуда у правообладателей MD5 рипов
0 |
0 / 0 / 0 Регистрация: 26.07.2015 Сообщений: 16 |
|
20.02.2017, 15:50 [ТС] |
13 |
D1973, можно по разному это называть, но по-моему, форум/тема не обсуждения пиратсва и т.д. YuryK, у правообладателей свои видео-файлы (ролики) и MD5 своих роликов получить у них нет проблем. Контент не проходит сотни торрентов, а берётся напрямую у правообладателя из официального сайта (из закрытой его части — платной). И да, не подумайте, что сфера деятельности обычные фильмы рунета и т.д. Это вообще не под рунет/варезники заточено, если кто-то думает про это. Поэтому, вникать, думаю, смысла нет. Главное решить вопрос изменения MD5.
0 |
30 / 31 / 20 Регистрация: 30.12.2015 Сообщений: 340 |
|
22.02.2017, 09:51 |
14 |
post4ok, откройте, блин, видео как текст.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
22.02.2017, 09:51 |
Помогаю со студенческими работами здесь MD5 Хеш файла
Получить хеш файла (CRC32, MD5, SHA1, TTH, ED2K, BitPrint, AICH….) Как реверсировать (преобразовать обратно) хеш MD5? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 14 |
Форум программистов Vingrad
Модераторы: Poseidon, Snowy, bems, MetalFan
Страницы: (2) Все [1] 2 |
Поиск: |
|
Опции темы |
Rexar |
|
||
Шустрый Профиль Репутация: 0
|
Как изменить контрольную сумму файла средствами Делфи……. |
||
|
|||
Poseidon |
|
||
Delphi developer Профиль
Репутация: 53
|
Какого файла? Формат? В общем случае можно просто открыть файл как текст и добавить туда пару символов. Хотя для некоторых форматов может не прокатить ——————— Если хочешь, что бы что-то работало — используй написанное, |
||
|
|||
Rexar |
|
||
Шустрый Профиль Репутация: 0
|
*.exe, если просто добавить символы, то программа не запуститься….. |
||
|
|||
Snowy |
|
||
Эксперт Профиль
Репутация: 192
|
Изменить контрольную сумму файла легко. Достаточно изменить любой байт файла и любой CRC выдвст другой результат. |
||
|
|||
Rexar |
|
||
Шустрый Профиль Репутация: 0
|
Нужно изменить размер файла, например чтоб больше был…….., это Hex редактором что-ли делать или как ? Я просто не пойму что ты написал |
||
|
|||
DIMONSOFT |
|
||
Бывалый Профиль
Репутация: 1
|
Антивирусам это непонравиться ——————— |
||
|
|||
Poseidon |
|
||
Delphi developer Профиль
Репутация: 53
|
DIMONSOFT, антивирусам все равно! ——————— Если хочешь, что бы что-то работало — используй написанное, |
||
|
|||
DIMONSOFT |
|
||
Бывалый Профиль
Репутация: 1
|
Согласен. Но непонятно что ——————— |
||
|
|||
Guest |
|
||
Unregistered
|
Я хочу вот что: есть файл 1.exe он занимает 48,8 КБ, нужно сделать так чтоб он занимал места больше чем 48,8 КБ, например 50,8 КБ. |
||
|
|||
Zero |
|
||
Эксперт Профиль
Репутация: 8
|
Да можно и текстовым редактором… Или я например, использую Total Commander, там выбираешь любой файл, и нажимаешь <F4> |
||
|
|||
Guedda |
|
||
Подрывник Профиль
Репутация: 14
|
Если у тебя есть исходники, то лучше дописать что-нить (кроме комментариев)… А если исходников нет, тогда лучше делать, как посоветовал Snowy ——————— Ll 2 |
||
|
|||
Yanis |
|
||
Эксперт Профиль
Репутация: 72
|
2 Rexar ———————
|
||
|
|||
Rexar |
|
||
Шустрый Профиль Репутация: 0
|
Как это сделать чтоб *.exe файл потом можно было запустить ? Если я тупо допишу через блокнот то экзэшник не запускается… |
||
|
|||
Poseidon |
|
||||
Delphi developer Профиль
Репутация: 53
|
——————— Если хочешь, что бы что-то работало — используй написанное, |
||||
|
|||||
Snowy |
|
||||
Эксперт Профиль
Репутация: 192
|
|
||||
|
|||||
Страницы: (2) Все [1] 2 |
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |