Автоматически «грубой силой» несколько байтов, чтобы восстановить поврежденный файл

4322
Sbt19

Кто-нибудь знает способ подбора значений силы при определенном смещении в файле? Это 4 последовательных байта, которые должны быть грубо форсированы. Я знаю правильный SHA-1 поврежденного файла. Итак, я хотел бы сравнить полный файл SHA-1, каждый раз, когда он меняет значение байта.

Я знаю точные 4 байта, которые были изменены, потому что файл был предоставлен мне экспертом по восстановлению данных, как задача восстановления. Для тех, кто интересуется знанием, файл rar имеет 4 байта, которые были намеренно изменены. Мне сказали смещения измененных 4 байтов и оригинального SHA-1. Человек сказал, что НЕВОЗМОЖНО восстановить точный файл в архиве после того, как 4 байта были изменены. Даже если бы было всего несколько байтов, и вы точно знали, где была обнаружена коррупция. Так как у него нет записи восстановления. Я пытаюсь увидеть, есть ли способ, чтобы эти 4 байта были правильно заполнены, чтобы файл распаковывался без ошибок. Размер файла составляет около 5 МБ.

Пример :

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

Скриншот первый

Скриншот два

Пример смещения, на котором я фокусируюсь, - это то, 0x78где на первом рисунке показано значение, так как CA я хочу, чтобы скрипт принял значение на 1, чтобы оно стало таким, CBкак показано на втором рисунке. Я хочу, чтобы он продолжал увеличивать значение, 1а затем сравнивать весь файл SHA-1 каждый раз. Вносить изменения только в эти 4 байта с указанным смещением.

Он попробует CAC5C58Aсравнить SHA-1. Если не совпадает, то он будет пытаться. CBC5C58AЗатем, как только первое значение достигнет FFего, затем перейдет к 00C6C58Aи так далее. В принципе, я бы хотел, чтобы он мог идти, 00000000-FFFFFFFFно также имел возможность выбрать, где вы хотите, чтобы он начинался и заканчивался. Я знаю, что это может занять некоторое время, но я все еще хотел бы попробовать это. Имейте в виду, я знаю точное смещение байтов, которые повреждены. Мне просто нужны правильные значения.

Если вы ищете в Google: «Как исправить поврежденный файл с помощью грубой силы», то есть человек, который написал программу для Linux. Тем не менее, он работает только против файлов, включенных в программу. Я ищу способ использовать тот же процесс с моим файлом.

34
Добро пожаловать в Супер пользователя! Я отредактировал ваш вопрос, чтобы удалить запрос на программу, которая была бы не по теме. Можете ли вы [отредактировать свой вопрос] (https://superuser.com/posts/1315393/edit) включить (некоторые из) примеров, которые вы видели? Хорошо, что вы провели исследование, но показали нам, какое именно исследование было бы полезным :) bertieb 5 лет назад 3
Спасибо за голову Бертиеб! Я добавил еще несколько деталей. Sbt19 5 лет назад 0
Могу ли я спросить, как вы получили этот файл и как вы можете быть уверены, что это только 4 поврежденных байта? Edoardo 5 лет назад 20
Знаете ли вы формат файла? Если вы это сделаете, вы сможете выработать правильные значения или ограничить диапазоны, вместо того, чтобы пытаться их перебором. В целом, однако, я бы предложил, чтобы любой поврежденный файл был выгружен из соображений безопасности. StephenG 5 лет назад 1
@eddyce Меня действительно интересует вторая часть вашего вопроса - * почему эти 4 байта? * Craig Otis 5 лет назад 11
Я предполагаю, что сообщение в блоге, на которое вы ссылаетесь, является https://conorpp.com/how-to-fix-a-corrupted-file-by-brute-force tripleee 5 лет назад 1
Из любопытства, как файл был поврежден? И откуда ты знаешь, что это были те четыре байта? JohnEye 5 лет назад 2
@CraigOtis я никогда не спрашивал, почему эти 4 байта, «как вы можете быть уверены, что это только 4 поврежденных», это то, что нужно Edoardo 5 лет назад 0
Программа "ghex" полезна для таких вещей. Lee Daniel Crocker 5 лет назад 0
@LeeDanielCrocker Не могли бы вы рассказать, насколько это полезно? Собираетесь ли вы вручную сохранить 4 миллиарда файлов в ghex, запустить на них sha и посмотреть, соответствует ли он? Немного утомительно. pipe 5 лет назад 0
Вопрос был в том, чтобы исправить несколько байтов в одном файле. Lee Daniel Crocker 5 лет назад 0
@LeeDanielCrocker Нет, вопрос в том, чтобы исправить это до тех пор, пока контрольная сумма не получит ожидаемое значение, и точно так же, как спросил канал, мы теперь задаемся вопросом, правильно ли вы прочитали вопрос, или действительно ли `ghex` может это сделать. tripleee 5 лет назад 1
Я добавил более подробную информацию о рассматриваемом файле. Это всего лишь тестовый файл восстановления данных. Sbt19 5 лет назад 1
@eddyce: Довольно легко попасть в эту ситуацию, если вы случайно сохранили правку в своем шестнадцатеричном редакторе, а затем сбрасывает свой буфер отмены при сохранении. (Я использовал те, которые делают это.) Mehrdad 5 лет назад 0
Обратите внимание, что из-за принципа «голубиная дыра» может быть несколько последовательностей байтов, которые соответствуют хешу. Одна из этих последовательностей может быть более «допустимой» для любого типа файла. Roger Lipscombe 5 лет назад 1
Похоже, вы ищете hex-редактор. https://softwarerecs.stackexchange.com/ это правильное место, чтобы спросить Mawg 5 лет назад 0
@ mehrdad хорошо, тогда это своего рода вызов :) совет: убедитесь, что вы проверяете файл на соответствие выданному вам SHA-1, а не только распаковываете архив RAR, потому что - возможно - измененные 4 байта являются частью записей RAR CRC ... Edoardo 5 лет назад 0
Вы могли бы рассчитать время, необходимое для того, чтобы sha1 текущего файла, умножить на 2 ^ 32 для наихудшего времени поиска. Если каждая оценка sha1 занимает 0,01 секунды, вы смотрите на худший случай 1,36 года, если вы не распараллелите поиск. В среднем половина этого. rrauenza 5 лет назад 0
Связанные https://math.stackexchange.com/questions/1410509/probability-number-of-guesses-to-get-the-correct-item-from-a-set-after-repet rrauenza 5 лет назад 0
[Давайте улучшать! Как мы нашли закрытый секретный ключ бумажника @ rogerkver за 1000 $] (https://medium.freecodecamp.org/lets-enhance-how-we-found-rogerkver-s-1000-wallet-obfuscated-private-key-8514e74a5433#c6c5) Vlastimil Ovčáčík 5 лет назад 0

2 ответа на вопрос

27
tripleee

Вот небольшая программа на Python, которая делает то, что вы, кажется, описываете.

#!/usr/bin/env python3 from hashlib import sha1  with open('binaryfile', 'rb') as bin: binary = bin.read()  base = 0x0078 # ... is not valid Python; add more sequences, or take it out (or see below) for seq in [[0xCA, 0xC5, 0xC5, 0x8A], [0xCB, 0xC5, 0xC5, 0x8A], ...]: copy = binary[0:base] copy += bytes(seq) copy += binary[base+len(seq):] if sha1(copy).hexdigest() == '9968733ce3ff0893bbb0a19e75faaf2fb0000e19': print('success with bytes '.format(seq)) break else: print('no success') 

ООНТолько кратко проверено; пожалуйста, пингуйте меня, если найдете опечатки.

В baseуказует, где, чтобы попытаться применить четыре байта, и длинная строку '996873... шестнадцатеричное представление ожидаемого SHA1. Строка for seq in... определяет байты, которые нужно попробовать; и, конечно, замените 'binaryfile'путь к файлу, который вы хотите попытаться спасти.

Вы можете заменить буквальный список [[0xCA, 0xC5,... ]]чем-то, что фактически зацикливает все возможные значения, но в основном это просто заполнитель для чего-то более полезного, потому что я не совсем уверен, чего именно вы там хотите.

Нечто подобное for seq in itertools.product(range(256), repeat=4)):зациклит все возможные значения от 0 до 2 32 -1. (Вам нужно будет добавить import itertoolsоколо верха.) Или, возможно, вы могли бы просто добавить смещение; обновите скрипт, чтобы заменить текущий for seq inна следующий (где снова importнужно идти перед основной программой);

import struct  for n in range(2**32): val=(n+0x8AC5C5CA) % 2**32 # notice reverse order seq=list(reversed(struct.pack(">I", val))) copy = ... 

Я изменил порядок байтов, чтобы он естественно увеличивался с 0x8AC5C5CA до 0x8AC5C5CB, но затем следующим шагом будет 0x8AC5C5CC и т. Д. structМагия заключается в преобразовании этого в последовательность байтов (пришлось искать его из https: // stackoverflow. com / a / 26920983/874188 ). Это начнется с 0x8AC5C5CA и перейдет к 0xFFFFFFFF, затем развернется к 0x00000000 и поднимется до 0x8AC5C5C9.

Если у вас есть несколько диапазонов кандидатов, которые вы хотели бы изучить в определенном порядке, может быть что-то вроде

for rge in [(0x8AC5C5CA, 0x8AFFFFFF), (0x00C6C58A, 0x00FFFFFF), (0x00000000, 0x00C6C589), (0x01000000, 0x8AC5C5C9)]: for val in range(*rge): seq=list(reversed(struct.pack(">I", val))) copy = ... 

но тогда вам нужно убедиться, что пары (начало, конец)rge покрывают все пространство между 0x00000000 и 0xFFFFFFFF, если вы действительно хотите проверить все это. (И снова, обратите внимание, что диапазон увеличивает последний байт и seqприменяет байты значения в обратном порядке, в соответствии с вашими заявленными требованиями.)

Если вы хотите использовать два разных baseадреса, вы быстро столкнетесь с тем, что возможно сделать в своей жизни с помощью грубой силы; но вы могли бы, например, разделить 4-байтовое число на две 2-байтовые части и применить их с разными смещениями.

base1 = 0x1234 base2 = 0x2345  for seq in range(whatever): copy = binary[0:base1] copy += bytes(seq[0:1]) copy += binary[base1+2:base1+base2] copy += bytes(seq[2:3]) copy += binary[base2+2:] 
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (https://chat.stackexchange.com/rooms/76323/discussion-on-answer-by-tripleee-automatics-brute-force-a-few-bytes-to-reco) , Journeyman Geek 5 лет назад 0
4
Hastur

Нет, нет, нет и снова НЕТ!

Редкий ответ, который вы получаете, не тот, который вы ожидаете.

Несколько вопросов для вас:

  • Возможно ли, что эксперт не знает, что можно грубо форсировать строку байтов и повторять попытку SHA-1, пока она не сойдет? нет
  • Возможно ли, что он забыл это? нет
  • Возможно ли, что вы не можете сделать это на RAR-файле? нет
  • Есть другой ответ не так? абсолютно НЕТ

И что? ... время

Дело в том, что вы должны изменить так мало байтов ... только 4!

Что это значит? 256 4, то есть 256x256x256x256 возможностей, действительно очень большое число.
Если ваш компьютер мог обрабатывать 1 операцию в секунду (подстановка в файле + sha1) ...
вам следует подождать более 136 лет или, если вы предпочитаете, более 49710 дней.

Вам повезло, предварительно кэшированный файл размером 5 МБ (уже загруженный в оперативную память и в кэш) запрашивает всего около 0,03 секунды (мин. 0,025 с) на старом компьютере. Это сокращает ваше ожидаемое время до 1242-1492 дней (что превышает 3 года).

Это правда, кстати, что по статистике у вас должен быть положительный ответ в половине случаев . Тем не менее, вам следует подождать, пока вы не попробуете все возможности, чтобы быть уверенным, что есть только одна замена, которая даст вам такую ​​же контрольную сумму SHA-1 ...

Теперь это НЕВОЗМОЖНО звучит как «невозможно в ДОСТОЙНОЕ количество времени».


Как действовать

Более правильный ответ на ваш технический вопрос: когда вы говорите о грубой силе, необязательно использовать слепую грубую силу.

  • В другом ответе просто указано, что вам не нужно вычислять контрольную сумму sha1 для детали до повреждения. Вы делаете 1-й раз и экономите время для каждой последующей итерации (может быть, фактор 2 зависит от позиции).

  • Что-то, что может изменить бесполезные усилия - это написать параллельный код, который будет работать на GPU. Если у вас хорошая графическая карта, у вас может быть около 1000 ядер, которые могут вычислять для вас параллельно (даже больше, но их частота ниже, чем у процессора, но все же их много). Если вы можете сократить время с 1400 до 1,4 дня, может быть, вы даже можете сделать это.

  • Другой подход может привести вас к более быстрому решению.
    Вы сказали, что это RAR файл. Структура файла rar разделена на блоки. Если вы примете это во внимание, вы увидите, куда падает коррупция. Если это на части данных, на части заголовков или на обоих. Тогда вы можете действовать соответственно. Для простоты, давайте предположим, что это по данным:
    вы можете сделать грубую силу своего смещения, проверить для каждого положительного CRC этого блока, если это даже положительный SHA1 для всего файла. Снова вы можете сделать параллельный код.

Конечная нота

Если бы они были 6 байтов вместо 4, вы вышли из игры с существующей технологией.

Отличный ответ - не обязательно нужно исчерпывать все пространство, хотя сам rar в этом примере не будет распаковываться из-за внутренних проверок, даже если sha1 работает с дублирующим хешем. Попадание 4 байтов, которые ошибочно решили sha1 И внутреннюю CRC, было бы очень маловероятным. rrauenza 5 лет назад 0
@rrauenza Спасибо. Кстати не только (двойная проверка). Действительно, блок должен быть короче всей части от поврежденных байтов до конца файла, а CRC должен быть легче для вычисления, чем алгоритм sha1 ... Hastur 5 лет назад 0
@rrauenza Знаете ли вы, как я мог бы заставить фактический параллельный код работать на GPU? У меня хороший графический процессор. Благодарю. Sbt19 5 лет назад 0
Нет, я не. Вы можете использовать несколько процессоров, разделив пространство поиска. rrauenza 5 лет назад 0
@ Sbt19 Что бы они ни говорили вам об этом, Google не так страшно использовать `;-)`. Ищите (если nvidia) `Cuda, brute force, sha1`, и у вас будет много подсказок, например, [исходный код] (https://github.com/smoes/SHA1-CUDA-bruteforce). Кстати, держите ваше внимание высоко, потому что _browing от этого пути Google, о мой мальчик, может привести вас на одну из темных сторон сети _... `:-)`. (Не на github ... на другом сайте, где вы можете встретиться с такого рода исследованиями). __PS> __ Существует множество научных работ по смежным темам, [например, эта] (https://ieeexplore.ieee.org/document/8001964/) ... Hastur 5 лет назад 0
@Hastur Хех, я очень хорошо использую Google: я знаю обо всех сторонах сети. Тем не менее, я не опытный в области программирования. Я знаю о грубом форсировании SHA1. Я не смог найти правильный код, который может перебить файл через графический процессор. Это было бы намного быстрее. PS Спасибо за ваш сложный ответ. Я уверен, что это поможет другим. Sbt19 5 лет назад 0
256⁴ - это около 4,3 миллиарда; это не совсем «действительно большое число». Это похоже, например, на тактовые частоты процессоров. PS: Когда я запускаю цифры на этом компьютере, которому несколько лет, у меня получается ~ 63 дня, без каких-либо сложностей, таких как использование графического процессора. derobert 5 лет назад 0
Кроме того, если у вас есть контрольная сумма CRC, было бы глупо грубой силой - вы можете сделать это аналитически. Тогда используйте SHA-1 только для тех, где проходит CRC (это должно разделить пространство поиска примерно на 2¹⁶, сократив время поиска до диапазона минут). derobert 5 лет назад 0
@ derobert 1). У меня проблема в том, чтобы сосчитать больше 21 (используя пальцы и нос ... `:-)`) для меня это действительно очень важно, когда вы думаете, чтобы завершить итерацию. 2). Сравнение с тактовой частотой ЦП имеет место, если у вас есть процессор, который в цикле способен выполнять SHA1 для всего файла 5 МБ (то есть для регистров 5 МБ ...) 3) Я полностью согласен с тем, что проще использовать информацию CRC (и я предложил), но ОП попросил SHA1 ... 4) Я полагаю, что концепция _WORTHWHILE_ является центральной точкой вопроса ... Hastur 5 лет назад 0
@Hastur На моем новом компьютере SHA-1 составляет ~ 490 МБ / с на ядро ​​(по крайней мере, на OpenSSL). На всех 4 ядрах это почти 2 ГБ / с. Я думаю, стоит ли это полностью зависеть от того, сколько стоят данные. Это «смущающая распараллеливание» проблема, поэтому вы можете легко (например) купить всю эту вычислительную мощность у Amazon EC2 (и т. Д.). Если c5large, по крайней мере, так же быстр, как моя не очень новая машина, то при текущих спотовых ценах это меньше $ 50, чтобы сделать это за час. derobert 5 лет назад 0
Я не могу больше с вами согласиться по поводу "смущающей параллелизуемости" _-проблемы. ИМХО, лучший подход без информации rar - это обновить переменную sha1 с помощью 1-го фрагмента файла (линейного), сгенерировать перестановки из 4 байтов, увеличить переменные sha1, упорядочить их уникально, продолжить sha1 со вторым фрагментом. С информацией rar это зависит, потому что, если она падает на данные и заголовок, вам нужно перестроить последний (но не считать в перестановках хотя бы 1 байт, если не все) ... тогда если блок rar (в котором происходит повреждение is) искать правильный CRC, затем sha1. Hastur 5 лет назад 0

Похожие вопросы