Забавляемся с хешами
Время прочтения
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 Как получить 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 Хеш файла Генерация 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
|
LOL
|
||||
|
|||||
Страницы: (2) Все [1] 2 |
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |