Czy ktoś tam zna sposób na brutalne wartości siły przy określonym przesunięciu w pliku? To 4 kolejne bajty, które trzeba by brutalnie wymusić. Znam prawidłowy SHA-1 uszkodzonego pliku. Chciałbym więc porównać cały plik SHA-1 za każdym razem, gdy zmienia on wartość bajtu.
Znam dokładnie 4 bajty, które zostały zmienione, ponieważ plik został mi przekazany przez eksperta od odzyskiwania danych jako wyzwanie odzyskiwania. Dla tych, którzy są zainteresowani wiedzą, plik rar ma 4 bajty, które zostały celowo zmienione. Powiedziano mi przesunięcia zmienionych 4 bajtów i oryginalnego SHA-1. Osoba powiedziała, że niemożliwe jest odzyskanie dokładnego pliku w archiwum po zmianie 4 bajtów. Nawet jeśli było to tylko kilka bajtów i dokładnie wiedziałeś, gdzie znajduje się uszkodzenie. Ponieważ nie ma rekordu odzyskiwania. Próbuję sprawdzić, czy istnieje sposób na prawidłowe wypełnienie tych 4 bajtów, aby plik rozpakował się bez błędów. Rozmiar pliku to około 5 MB.
Przykład :
Przesłałem zdjęcia, aby było wyraźniej określone, co dokładnie chcę zrobić. Wierzę, że ktoś może opublikować je tutaj dla mnie z większym przedstawicielem.
Przykładowe przesunięcie, na 0x78
którym się skupiam, to miejsce, w którym pierwsze zdjęcie pokazuje wartość, ponieważ CA
chcę, aby skrypt podniósł wartość o 1, aby stała się CB
jak pokazano na drugim zdjęciu. Chcę, aby ciągle zwiększał wartość, 1
a następnie porównywał cały plik SHA-1 za każdym razem. Wprowadzanie zmian tylko w tych 4 bajtach z określonym przesunięciem.
Spróbuje CAC5C58A
porównać SHA-1. Jeśli nie pasuje, to spróbuje. CBC5C58A
Następnie, gdy pierwsza wartość osiągnie FF
, przejdzie do 00C6C58A
i tak dalej. Zasadniczo chciałbym, aby można było z niego przejść, 00000000-FFFFFFFF
ale także mieć możliwość wyboru, gdzie chcesz, aby zaczął i skończył. Wiem, że może to zająć trochę czasu, ale nadal chciałbym spróbować. Pamiętaj, że znam dokładne przesunięcie bajtów, które są uszkodzone. Potrzebuję tylko poprawnych wartości.
Jeśli wyszukujesz w Google: „Jak naprawić uszkodzony plik brutalną siłą”, istnieje osoba, która napisała program dla systemu Linux. Działa to jednak tylko z plikami dołączonymi do programu. Szukam sposobu na użycie tego samego procesu z moim plikiem.
źródło
Odpowiedzi:
Oto mały program w języku Python, który robi to, co wydajesz się opisywać.
UnTylko krótko przetestowane; proszę ping mnie, jeśli znajdziesz literówki.W
base
Określa gdzie spróbuj zastosować cztery bajty, a długi ciąg'996873
... jest reprezentacją hex oczekiwanego SHA1. Liniafor seq in
... określa bajty do wypróbowania; i oczywiście zastąp'binaryfile'
ścieżką do pliku, który chcesz spróbować odzyskać.Możesz zastąpić dosłowną listę
[[0xCA, 0xC5,
...]]
czymś, co faktycznie zapętla wszystkie możliwe wartości, ale jest to po prostu symbol zastępczy dla czegoś bardziej przydatnego, ponieważ nie jestem pewien, co dokładnie tam chcesz.Coś takiego
for seq in itertools.product(range(256), repeat=4)):
zapętli wszystkie możliwe wartości od 0 do 2 32 -1. (Musisz wtedy dodaćimport itertools
u góry.) A może po prostu możesz dodać przesunięcie; zaktualizuj skrypt, aby zastąpił bieżącyfor seq in
następującym (tam, gdzie ponownieimport
musi przejść przed programem głównym);Odwróciłem kolejność bajtów, aby naturalnie zwiększała się z 0x8AC5C5CA do 0x8AC5C5CB, ale następnie następnym przyrostem będzie 0x8AC5C5CC itp.
struct
Magią jest przekonwertowanie tego na sekwencję bajtów (musiałem to sprawdzić z https: // stackoverflow. com / a / 26920983/874188 ). Rozpocznie się to od 0x8AC5C5CA i przejdzie do 0xFFFFFFFF, następnie zawinie do 0x00000000 i wróci do 0x8AC5C5C9.Jeśli masz wiele zakresów kandydatów, które chciałbyś sprawdzić w określonej kolejności, być może coś w tym rodzaju
ale musisz się upewnić, że pary (początek, koniec)
rge
obejmują całą przestrzeń między 0x00000000 a 0xFFFFFFFF, jeśli naprawdę chcesz to wszystko zbadać. (I znowu zauważ, że zakres zwiększa ostatni bajt i żeseq
stosuje bajty wartości w odwrotnej kolejności, zgodnie z podanymi wymaganiami).Jeśli chciałbyś użyć dwóch różnych
base
adresów, szybko przekraczasz granice tego, co jest możliwe w życiu z brutalną siłą; ale możesz na przykład podzielić 4-bajtową liczbę na dwie 2-bajtowe części i zastosować je przy różnych przesunięciach.źródło
Nie, nie, nie i jeszcze raz NIE!
Rzadko pojawia się odpowiedź, której się nie spodziewasz.
Kilka pytań do ciebie:
Więc co? ... czas.
Chodzi o to, że musisz zmienić tak mało bajtów ... tylko 4!
Co to znaczy? 256 4 czyli 256x256x256x256 możliwości, to naprawdę bardzo duża liczba.
Jeśli twój komputer był w stanie przetworzyć 1 operację na sekundę (podstawienie w pliku + sha1) ...
powinieneś poczekać ponad 136 lat , lub jeśli wolisz dłużej niż 49710 dni.
Masz szczęście, 5 MB wstępnie buforowany plik (już załadowany do pamięci RAM i pamięci podręcznej) prosi tylko o około 0,03 sekundy (min. 0,025 s) na starym komputerze. To skraca czas oczekiwania do 1242-1492 dni (coś więcej niż 3 lata).
Prawdą jest, BTW, że statystycznie powinieneś mieć pozytywną odpowiedź w połowie czasu . Niemniej jednak powinieneś poczekać, aż wypróbujesz wszystkie możliwości, aby upewnić się, że istnieje tylko 1 podstawienie, które da ci tę samą sumę kontrolną SHA-1 ...
Teraz, gdy NIEMOŻLIWE dźwięki brzmią jak „niemożliwe w WSPÓŁCZESNYM czasie”.
Jak postępować
Bardziej właściwa odpowiedź na twoje pytanie techniczne: kiedy mówisz o brutalnej sile, nie musi być koniecznie ślepa, brutalna siła.
W komentarzu w drugiej odpowiedzi stwierdzono tylko, że nie trzeba obliczać sumy kontrolnej sha1 dla części przed uszkodzeniem. Robisz za pierwszym razem i oszczędzasz czas na każdą kolejną iterację (może współczynnik 2 zależy od pozycji).
Coś, co może zmienić bezwartościowy wysiłek, to napisanie równoległego kodu, który będzie działał na GPU. Jeśli masz dobrą kartę graficzną, możesz mieć około 1000 rdzeni, które mogą obliczyć dla ciebie równolegle (nawet więcej, ale mają częstotliwość niższą niż procesor, ale wciąż są dużo). Jeśli jesteś w stanie skrócić czas z 1400 do 1,4 dnia, być może możesz to zrobić.
Inne podejście może doprowadzić do szybszego rozwiązania.
Powiedziałeś, że to plik rar. Struktura pliku rar jest podzielona na bloki. Jeśli weźmiesz to pod uwagę, zobaczysz, gdzie spada korupcja. Jeśli jest to część danych, część nagłówków lub obie. Następnie możesz działać konsekwentnie. Dla uproszczenia załóżmy, że dotyczy to danych:
możesz wykonać brutalną siłę swojego przesunięcia, sprawdzić dla każdego dodatniego CRC tego bloku, czy jest to dodatni SHA1 na całym pliku. Ponownie możesz zrobić kod równoległy.
Ostatnia uwaga
Jeśli miałyby one 6 bajtów zamiast 4, to nie grałeś z obecną technologią.
źródło
;-)
. Wyszukaj (jeśli nvidia),Cuda, brute force, sha1
a będziesz miał wiele podpowiedzi, np . Kod źródłowy . BTW utrzymać szczególnej uwagi, ponieważ przeglądanie od tej ścieżki google, och mój chłopcze, może doprowadzić Cię na jednym z boków ciemności siatki ...:-)
. (Nie na github ... na innej stronie, na której możesz spotkać się z tego rodzaju badaniami). PS> Istnieje wiele prac naukowych na pokrewne tematy, np. Ten ...