Автоматично 'груба сила' кілька байтів, щоб відновити пошкоджений файл


35

Хтось там знає про спосіб придушити величини сили при конкретному зсуві у файлі? Це 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. Однак він працює лише проти файлів, що входять до програми. Я шукаю спосіб використовувати той самий процес зі своїм файлом.


3
Ласкаво просимо до Супер Користувача! Я відредагував ваше запитання, щоб видалити запит на програму, що було б поза темою. Чи можете ви відредагувати своє запитання, щоб включити (деякі) приклади, які ви бачили? Добре, що ви провели дослідження, але показали нам саме те, яке дослідження було б корисним :)
bertieb

20
я можу запитати, як у вас опинився цей файл і як ви можете бути впевнені, що це єдині 4 пошкоджені байти?
Едоардо

1
Чи знаєте ви формат файлу? Якщо ви це зробите, можливо, вам вдасться виправити правильні значення або обмежити діапазони, а не намагатися придушити їх. Загалом, однак, я б радив, щоб будь-який пошкоджений файл вивантажувався з міркувань безпеки.
StephenG

11
@eddyce Мені дуже цікава друга частина вашого запитання - чому ці 4 байти?
Крейг Отіс

2
З цікавості, як файл зіпсувався? І як ти знаєш, що це були ці чотири байти?
JohnEye

Відповіді:


27

Ось невеличка програма 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 {0}'.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:]

Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Подорожник Geek

4

Ні, ні, ні і знову НІ!

Рідко відповідь, яку ви отримаєте, - це не те, чого ви очікуєте.

Кілька питань до вас:

  • Чи можливо, що експерт не знає, що можна грубо примусити рядок байтів і ітеративно спробувати SHA-1, поки він не сходиться? Ні
  • Чи можливо він його забув? Ні
  • Чи можливо, ви не можете це зробити у файлі rar? Ні
  • Є інший відповідь не так? абсолютно НІ

І що? ... Час.

Справа в тому, що вам потрібно змінити так мало байтів ... лише 4!

Що це означає? 256 4 , тобто 256x256x256x256 можливостей, дійсно дуже велика кількість.
Якщо ваш комп'ютер зміг обробити 1 операцію в секунду (підміна у файлі + sha1) ...
вам слід почекати більше 136 років або якщо ви віддаєте перевагу більше 49710 днів.

Вам досить пощастило, попередній кешований файл на 5 Мб (уже завантажений в операційній пам’яті та в кеш-пам'яті) на старий комп'ютер запитує лише приблизно 0,03 секунди (хв. 0,025 секунди). Це скорочує очікуваний час до 1242-1492 днів (щось більше, ніж 3 роки).

Це правда, BTW, що статистично ви повинні мати позитивну відповідь у половині часу . Тим не менш, ви повинні зачекати, поки ви не спробуєте всі можливості, щоб бути впевненим, що існує лише 1 заміна, яка дасть вам ту саму контрольну суму SHA-1 ...

Тепер, коли БЕЗПЕЧНІ звучить як "неможливо за короткий час".


Як діяти далі

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

  • У коментарі в іншій відповіді просто зазначено, що вам не потрібно обчислювати контрольну суму ша1 перед корупцією. Ви робите перший раз, і ви економите час для кожної наступної ітерації (можливо, коефіцієнт 2 - це залежить від позиції).

  • Щось, що може змінити марні зусилля, - це написати паралельний код, який працюватиме на GPU. Якщо у вас хороша відеокарта, у вас може бути близько 1000 ядер, які можуть обчислювати вас паралельно (навіть більше, але вони мають частоту нижче, ніж процесор, але все-таки їх багато). Якщо ви можете скоротити час з 1400 до 1,4 дня, можливо, ви навіть можете це зробити.

  • Інший підхід може привести вас до швидшого рішення.
    Ви сказали, що це файл rar. Структура файлу rar розділена на блоки. Якщо порахувати, то можна побачити, куди потрапляє корупція. Якщо це з боку даних, з боку заголовків або з обох. Тоді ви можете діяти внаслідок цього. Для простоти, припустимо, це над даними:
    ви можете виконати грубу силу свого зміщення, перевірити кожну позитивну CRC цього блоку, якщо вона навіть позитивна SHA1 у всьому файлі. Знову можна зробити паралельний код.

Заключна примітка

Якщо вони були 6 байтами замість 4, ви вийшли з гри за допомогою теперішньої технології.


Чудова відповідь - не обов'язково потрібно буде вичерпати весь простір, хоча тому, що сам рар у цьому прикладі не зніметься через внутрішні перевірки, навіть якщо sha1 працював із дублюючим хешем. Попадання 4 байтів, які помилково вирішили sha1 І внутрішній crc, було б дуже малоймовірним.
rrauenza

@rrauenza Дякую BTW не тільки (подвійна перевірка). Дійсно, блок повинен бути коротшим, ніж вся частина від пошкоджених байтів до кінця файлу, а CRC повинен бути легшим для обчислення, тоді алгоритм sha1 ...
Хастур,

@rrauenza Чи знаєте ви, як би я почав отримувати фактичний паралельний код для роботи на GPU? У мене хороший GPU. Спасибі.
Sbt19

Ні, я не. Ви можете використовувати декілька cpus, хоча розділити простір пошуку.
rrauenza

@ Sbt19 Що б вони вам не сказали про Google, це не так страшно використовувати ;-). Шукайте (якщо nvidia), Cuda, brute force, sha1і у вас з’явиться багато підказок, наприклад вихідний код . ДО РЕЧІ тримати своє високе увагу , тому що перегляд з цього шляху Google, про мій хлопчик, може привести вас на одній з темних сторін мережі ... :-). (Не на Github ... на інших сайтах, з якими можна зустрітись із подібними дослідженнями). PS> Існує багато наукових праць на суміжні теми, наприклад, ця ...
Хастур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.