eXeL@B —› Вопросы новичков —› Как подобрать добавочные байты, чтобы сошлась MD5 сумма файла? |
<< . 1 . 2 . 3 . |
Посл.ответ | Сообщение |
|
Создано: 23 июня 2018 19:20 · Личное сообщение · #1 Прошу немного просветить про МД5. Вобщем есть прошивка под контроллер. В ней проверяется целостность байт по следующей схеме: Считается MD5 сумма, заданного количества байт (все полезные байты прошивки). Потом эта сумма криптуется алгоритмом RSA с 1760 битным ключем. Менять RSA ключи нельзя, они проверяются. (Вернее можно, но придется прошивку в корне переписать). Что я хочу сделать. Увеличить размер проверяемых байт (например) на размер блока МД5, 64 байта. И подобрать эти последние добавленные байты, так чтобы сумма МД5 нового файла прошивки сошлась с суммой оригинальной прошивки. Соответственно вопросы: 1. Не преувеличиваю-ли я размер добавляемых байт? Может достаточно добавить 4 - 16 байт? 2. Есть какие-то известные брутфорсы, которые допускают ввести начальную МД5, отличную от стандартной (0123456789ABCDEFFEDCBA9876543210), и считающую размер в битах для финального блока не от нуля, а от заданного размера? |
|
Создано: 24 июня 2018 01:19 · Личное сообщение · #2 Kuzya69 Тебе же 10 раз сказали, что это Запускай факторизацию рса, ибо тоже есть вероятность, что первые числа подойдут. |
|
Создано: 24 июня 2018 01:21 · Личное сообщение · #3 |
|
Создано: 24 июня 2018 01:26 · Личное сообщение · #4 Запускай факторизацию рса, ибо тоже есть вероятность, что первые числа подойдут. Запускал уже, и если грамотно подобраны сомножители под ModulusN, то там действительно ловить нечего, на больших числах. Потому-как коллизии исключены. А на МД5, коллизии есть, и их может быть очень много, и никто не знает сколько их. содержимое да, но длинна выхлопа не меняется. Да. А где я другое мог написАть? |
|
Создано: 24 июня 2018 01:27 · Личное сообщение · #5 |
|
Создано: 24 июня 2018 01:46 · Поправил: Bronco · Личное сообщение · #6 rmn пишет: а потом использовать его как вектор инициализации угу...очевидно инит вектор уже в другом алгоритме, допускаю что это RSA. ну соль от мд5 можно и от не патченного массива получить, главное чтобы дамп прошивки был. только смысл её брутить, мне не понятен. если диспут о содержимом массива, и подбора цепочки байт, то ответ во втором посте, это не црц32, не прокатит. ----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
|
Создано: 24 июня 2018 02:20 · Личное сообщение · #7 |
|
Создано: 24 июня 2018 09:08 · Личное сообщение · #8 |
|
Создано: 24 июня 2018 09:51 · Поправил: kunix · Личное сообщение · #9 Тут кто-то писал, что 2^64 перебрать нереально. Вики другого мнения. https://en.wikipedia.org/wiki/MD5CRK В таком случае, блин, есть следующая идея. Я и не думал, что такое возможно, если честно. Итак, мы пропатчили прошивку без изменения длины. Хеш прошивки изменился, длина осталась той же. Допустим, в конце прошивки после всех патчей остался некий 64-байтный блок, который мы можем свободно патчить. Рассмотрим, как работает тело цикла for i from 0 to 63. Пусть M[i] - это i-ый байт текущего 64-байтного блока, а S[i] = (A,B,C,D) - текущее состояние в начале i-ой итерации, четыре DWORD-а, 16 байт. Там в теле цикла фактически что-то типа S[i+1] = FU(S[i],i,M[i]). Причем, если посмотреть на что эта FU - обратимая функция, т.е. зная i и M[i] мы можем так же быстро вычислить S[i] = UF(S[i+1],i,M{i}). Тогда у нас c одной стороны S[32] = FU(F[31],31,M[31]) = FU(FU(F[30],30,M[30]),31,M[31]) = ... = FU1(S[0],M[0],...,M[31]); И с другой стороны S[32] = UF(S[33], 32, M[32]) = UF(UF(S[34], 33, M[33]), 32, M[32]) = ... = UF1(S[64],M[32],...,M[63]); S[0] и S[64] заданы извне. Мы выбираем их так, чтобы все раунды MD5 после текущего вычислялись как в старой прошивке. В частности, нужно учесть вот это Code:
Итак, нам похимичить с M[0],...,M[31] и M[32],...,M[63], чтобы совпало S[32], 16 байт. Короче, можно делать birthday attack, сложность будет 2^64. Достаточно, чтобы длина прошивки не менялась и был 64-байтный блок после всех патчей, который мы можем свободно менять. Короче, это некий пиздец. Где я ошибся? РАЗОБРАЛСЯ... Суть в том, что там на самом деле S[32] = FU1(S[0],M[0],...,M[31],M[32],...,M[63]); S[32] = UF1(S[64],M[0],...,M[31],M[32],...,M[63]); Поэтому не получится посчитать их независимо. Псевдокод MD5 с википедии: https://en.wikipedia.org/wiki/MD5 Code:
|
|
Создано: 24 июня 2018 10:16 · Поправил: f13nd · Личное сообщение · #10 kunix пишет: Тут кто-то писал, что 2^64 перебрать нереально. Если о предложенной ранее meet-in-middle на саму цп, то каждая итерация подразумевает проверку получившейся цп публичным ключем. RSA в чистом виде практически нигде не применяется, потому что кампуцер не умеет ни умножать ни делить, может это делать только сложением-сравнением с чудовищными потерями времени. Не знаю что ты в псевдокоде углядел, МД5 это FF, GG, HH и II-операции над разными комбинациями A,B,C,D (один из которых обновляется каждой такой операцией), даннми из буфера и константой. Предыдущее состояние МД5 в конце складывается с получившимися A,B,C,D. Не понял что ты хочешь "посчитать быстро". Получить A можно без 3 последних операций, B,C,D соответственно без 0,1 и 2, больше из алгоритма нечего выбрасывать и "посчитать быстро" без всего остального - как? Code:
----- 2 оттенка серого |
|
Создано: 24 июня 2018 10:31 · Поправил: kunix · Личное сообщение · #11 f13nd пишет: Если о предложенной ранее meet-in-middle на саму цп, то каждая итерация подразумевает проверку получившейся цп публичным ключем. RSA в чистом виде практически нигде не применяется, потому что кампуцер не умеет ни умножать ни делить, может это делать только сложением-сравнением с чудовищными потерями времени. Я вообще говорил о возможности совершения 2^64 операций средне-малой вычислительной сложности на доступном железе. Если одна операция медленнее другой в 100 раз, можно взять ботнет в 100 раз больше, понимаешь? Поэтому разброс достаточно большой может быть. Это все равно лишь грубые прикидки. f13nd пишет: Не знаю что ты в псевдокоде углядел, МД5 это FF, GG, HH и II-операции над разными комбинациями A,B,C,D, даннми из буфера и константой. MD5 - это в первую очередь хеш-функция, построенная из некоего блочного шифра по Merkle–Damgård, с внутренним состоянием 16 байт. Я не разбираюсь в этом псевдокоде с FF, GG, HH и II, мне надо подумать. Мне нравится псевдокод у википидоров, там все более-менее понятно. Добавлено спустя 6 минут f13nd пишет: Не знаю что ты в псевдокоде углядел, МД5 это FF, GG, HH и II-операции над разными комбинациями A,B,C,D (один из которых обновляется каждой такой операцией), даннми из буфера и константой. Предыдущее состояние МД5 в конце складывается с получившимися A,B,C,D. Не понял что ты хочешь "посчитать быстро". Если я верно понимаю, все эти FF, GG, HH и II - обратимые операции (если знать кусок сообщения M[i], конечно). Единственная необратимая операция - это сложение в конце, но мой метод работает внутри одного блока, между двумя сложениями, ему похер на сложения. UPD: Ну короче, эти FF, GG, HH, II - это итерации цикла. Это все FU в моей терминологии. Они обратимы, если знать нужный байт сообщения. Code:
|
|
Создано: 24 июня 2018 10:38 · Личное сообщение · #12 kunix пишет: можно взять ботнет в 100 раз больше, понимаешь? Если всю мочу собрать, да при том умело, можно солнце обосцать, чтоб оно шипело! kunix пишет: Я не разбираюсь в этом псевдокоде с FF, GG, HH и II, мне надо подумать. Просто он нифига непонятен и все. Ключевое слово "внутреннее состояние", которое меняется в процессе, и не проделав всю последовательность, "быстро получить результат" нельзя. Добавлено спустя 17 минут kunix пишет: Ну короче, эти FF, GG, HH, II - это итерации цикла. Это все FU в моей терминологии. Они обратимы, если знать нужный байт сообщения. Что во что ты обратишь? Мгновенные значения A,B,C,D в нужный байт буфера? Из чего ты обратишь эти самые мгновенные A,B,C,D? Из других мгновенных значений двигаясь либо от предыдущего значения МД5, либо от последующего. И там другие значения байт из буфера будут участвовать, их ты откуда обратишь? ----- 2 оттенка серого |
|
Создано: 24 июня 2018 11:04 · Поправил: kunix · Личное сообщение · #13 |
|
Создано: 24 июня 2018 11:07 · Личное сообщение · #14 kunix пишет: Моя задача, задавая значения буфера, свести концы с концами. Значения буфера задаешь ты сам и "быстро проверяешь, не применив весь алгоритм"... Как? Добавлено спустя 15 минут kunix пишет: А именно, чтобы один S[32] совпал с другим S[32]. Так как S[32] - всего 16 байт, я это сделаю за 2^{128/2} = 2^64 операций. S(0) инициализирующее значение, S(64) значение на выходе, S(32) очевидно посередине. Подобрать такие значения М[0..31] и М[32..63], чтоб S(33..63) совпадали с эталонными. Учитывая то, что каждый из байтов M используется по во всём алгоритме по 4 раза, мне кажется это дичь какая-то. Ну попробуй. ----- 2 оттенка серого |
|
Создано: 24 июня 2018 11:26 · Поправил: kunix · Личное сообщение · #15 f13nd пишет: S(0) инициализирующее значение, S(64) значение на выходе, S(32) очевидно посередине. Подобрать такие значения М[0..31] и М[32..63], чтоб S(33..63) совпадали с эталонными. Учитывая то, что каждый из байтов M используется по во всём алгоритме по 4 раза, мне кажется это дичь какая-то. Ну попробуй. Да, вот где я ошибся. Перепутал K[i] с M[g]. Думал, каждый байт буфера лишь один раз используется. UPD. Но гляди, если получится найти 4 DWORD-а в исходном буфере и некое S[k] так, первые два DWORD-а применяются до S[k], а вторые два после S[k], то все сработает. Это я к чему - самостоятельно хороший криптографически стойкий хеш сходу придумать ну очень сложно. Будет куча проебов. |
|
Создано: 24 июня 2018 12:08 · Поправил: f13nd · Личное сообщение · #16 kunix пишет: найти 4 DWORD-а в исходном буфере и некое S[k] так, первые два DWORD-а применяются до S[k], а вторые два после S[k], то все сработает. Сомневаюсь. Я в свое время с рипемд160 просто конское количество часов просидел, раскидав его на and/or/xor операции над отдельными битами, и какой только дичи не перепробовал с этим графом. Есть там узлы потяжелей с 10-12 связями, но даже их перебор никаких похожих на успех результатов не принес. Это комплексная задача и на ряд элементарных не раскладывается. ----- 2 оттенка серого |
|
Создано: 24 июня 2018 12:13 · Личное сообщение · #17 |
|
Создано: 25 июня 2018 12:17 · Поправил: Kuzya69 · Личное сообщение · #18 |
|
Создано: 25 июня 2018 12:29 · Личное сообщение · #19 Kuzya69 пишет: Каким компиллятором лучше воспользоваться, чтобы собрать исходник BarsWF Файлы с расширением .vcxproj как бы намекают на главный сишный компилятор MS Visual Studio. ----- 2 оттенка серого | Сообщение посчитали полезным: Kuzya69 |
<< . 1 . 2 . 3 . |
eXeL@B —› Вопросы новичков —› Как подобрать добавочные байты, чтобы сошлась MD5 сумма файла? |