Bozuk bir dosyayı kurtarmak için otomatik olarak "kaba kuvvet" birkaç bayt


35

Dışarıdaki herhangi biri, bir dosyadaki belirli bir uzaklıktaki kuvvet değerlerini kırmak için bir yol biliyor mu? Zorla zorlanması gereken 4 ardışık bayt. Bozuk dosyanın doğru SHA-1'ini biliyorum. Bu yüzden, yapmak istediğim, bayt değerini her değiştirdiğinde SHA-1 dosyasının tamamını karşılaştırmak.

Tam olarak değişen 4 baytı biliyorum, çünkü dosya bana bir veri kurtarma uzmanı tarafından kurtarma zorluğu olarak verildi. Bilmek isteyenler için, rar dosyasının kasıtlı olarak değiştirilmiş 4 baytı vardır. Değiştirilen 4 bayt ve orijinal SHA-1'in ofsetleri söylendi. Kişi, 4 bayt değiştirildikten sonra arşivdeki tam dosyayı kurtarmanın IMPOSSIBLE olduğunu söyledi. Sadece birkaç bayt olsaydı ve yolsuzluğun nerede olduğunu tam olarak biliyordun. Kurtarma kaydına sahip olmadığından. Bu 4 baytın doğru bir şekilde doldurulmasının bir yolu olup olmadığını görmeye çalışıyorum, böylece dosya hatasız bir şekilde açılacak. Dosya boyutu 5 MB civarındadır.

Örnek :

Fotoğrafları yükledim, bu yüzden tam olarak ne yapmak istediğimden daha net bir şekilde tanımlandı. Birinin onları benim için buraya daha fazla temsilci ile gönderebileceğine inanıyorum.

Ekran görüntüsü bir

Ekran Görüntüsü İki

Odaklandığım örnek ofset 0x78, ilk resmin, CA betiğin değeri 1'e çıkarmasını istediğimden, böylece CBikinci resimdeki gibi göründüğü değeri gösterir . Değeri arttırmaya devam etmek 1ve ardından her seferinde SHA-1 dosyasının tamamını karşılaştırmak istiyorum . Yalnızca belirtilen konumda yalnızca bu 4 bayta değişiklik yapmak.

CAC5C58ASHA-1'i dener ve karşılaştırır. CBC5C58AEşleşmezse , o zaman deneyecek . İlk değer ulaştığında FF, o zaman 00C6C58Aböyle devam edecek. Temel olarak, onun üzerinden gidebilmesini 00000000-FFFFFFFFancak aynı zamanda nerede başlayıp bitmesini istediğinizi seçme seçeneğine sahip olmayı istiyorum. Biraz zaman alabileceğini biliyorum ama yine de denemek istiyorum. Unutmayın, bozuk olan baytların tam olarak ofsetini biliyorum. Sadece doğru değerlere ihtiyacım var.

Google’da arama yaparsanız: “Bozuk bir dosyayı kaba kuvvetle nasıl düzeltirim?” Bir Linux programı yazan bir kişi var. Ancak, yalnızca programla birlikte verilen dosyalara karşı çalışır. Dosyamla aynı işlemi kullanmanın bir yolunu arıyorum.


3
Süper Kullanıcıya Hoşgeldiniz! Konuyla ilgisiz bir program isteğini kaldırmak için sorunuzu düzelttim. Eğer Can sorunuzu düzenleyin (bazılarını) Gördüğün örnekler için? Araştırma yapmış olmanız iyi bir şey, ancak bize tam olarak hangi araştırmanın yardımcı olacağını gösteriyor :)
bertieb

20
Bu dosya ile nasıl bittiğinizi ve bunların sadece 4 bozuk bayt olduğundan nasıl emin olabileceğinizi sorabilir miyim?
Edoardo

1
Dosya formatını biliyor musunuz? Bunu yaparsanız, zorlamak için zorlamak yerine doğru değerleri hesaplayabilir veya aralıkları sınırlandırabilirsiniz. Ancak genel olarak, güvenlik nedeniyle herhangi bir bozuk dosyanın atılması gerektiğini öneririm.
StephenG

11
@ eddyce Sorunuzun ikinci kısmıyla gerçekten ilgileniyorum - neden bu 4 byte?
Craig Otis

2
Meraktan, dosya nasıl bozuldu? Ve bunun dört bayt olduğunu nereden biliyorsun?
JohnEye

Yanıtlar:


27

İşte tarif ettiğiniz gibi görünen küçük bir Python programı.

#!/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')

unSadece kısaca test edildi; yazım hataları bulursanız lütfen bana ping.

baseDört bayt uygulamak için denemek için belirtir ve uzun dize '996873... beklenen SHA1 altıgen temsilidir. Satır for seq in... denenecek baytları tanımlar; ve elbette 'binaryfile', kurtarmayı denemek istediğiniz dosyanın yoluyla değiştirin .

Değişmezler listesinin yerine [[0xCA, 0xC5,... ]]aslında tüm olası değerlerin üzerinden geçen bir şeyle değiştirebilirsiniz, ancak temelde daha kullanışlı bir şey için sadece bir yer tutucusu çünkü tam olarak ne istediğinizi tam olarak bilmiyorum.

Gibi bir şey for seq in itertools.product(range(256), repeat=4)):0 ile 2 32 -1 arasındaki tüm olası değerlerin üzerinden geçecektir . (Daha import itertoolssonra en üste eklemeniz gerekir .) Ya da belki sadece bir kayma ekleyebilirsiniz; akımı for seq inşununla değiştirmek için komut dosyasını güncelleyin (burada yine importana programdan önce yapılması gerekenler);

import struct

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

Baytların sırasını değiştirdim, böylelikle doğal olarak 0x8AC5C5CA'dan 0x8AC5C5CB'ye yükselir, ancak sonraki artış 0x8AC5C5CC vs. olur. structSihir bunu bir bayt dizisine dönüştürmektir ( https: // stackoverflow'dan bakmak zorunda kaldı) . com / a / 26920983/874188 ). Bu, 0x8AC5C5CA ile başlayıp 0xFFFFFFFF’a gidecektir, daha sonra 0x00000000’e sarılıp 0x8AC5C5C9’a geri dönecektir.

Birden fazla aday aralığınız varsa, belirli bir sırayla incelemek, belki de

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

ancak daha sonra gerçekten incelemek istiyorsanız (başlangıç, bitiş) çiftlerinin rge0x00000000 ve 0xFFFFFFFF arasındaki tüm alanı kapladığından emin olmanız gerekir. (Ve yine, aralığın, son baytı artırdığını ve seqdeğerin baytlarını belirtilen gereksinimlerinize göre ters olarak uyguladığına dikkat edin.)

İki farklı baseadres kullanmak istiyorsanız, hızlı bir şekilde yaşamınız boyunca yapabileceklerinizin sınırlarını kaba kuvvetle karşı koyarsınız; ancak, örneğin, 4 baytlık sayıyı iki 2 baytlık bölüme ayırabilir ve bunları farklı ofsetlerde uygulayabilirsiniz.

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:]

Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Journeyman Geek

4

Hayır, hayır, hayır ve tekrar NO!

Nadiren aldığınız cevap beklediğiniz gibi olmaz.

Sizin için bazı sorular:

  • Bir uzmanın bir bayt için zorla kuvvete zorlamasının mümkün olup olmadığını bilmesi ve bir araya gelinceye kadar SHA-1'i yinelemeli olarak denemesi mümkün mü? Yok hayır
  • Unutması mümkün mü? Yok hayır
  • Bir rar dosyasına yapamamanız mümkün mü? Yok hayır
  • başka cevap yanlış? kesinlikle hayır

Ne olmuş yani? ... Zaman.

Mesele şu ki, bu kadar az byte değiştirmek zorundasın ... sadece 4!

Bu ne anlama geliyor? 256 4 256x256x256x256 olasılık, gerçekten büyük bir rakam.
Bilgisayarınız saniyede 1 işlemi gerçekleştirebiliyorsa (+ sha1 dosyasındaki değiştirme) ...
136 yıldan fazla beklemelisiniz veya 49710 günden fazla tercih ediyorsanız.

Yeterince şanslısınız, 5 MB önbelleğe alınmış bir dosya (önceden ram ve önbellekte yüklü), eski bir bilgisayarda yalnızca yaklaşık 0.03 saniye (en az 0.025 sn) sorar. Bu, bekleme sürenizi 1242-1492 güne düşürür (3 yıldan fazla bir şey).

Doğru, BTW, istatistiksel olarak zamanın yarısında olumlu bir cevap almanız gerektiği doğru . Yine de, size aynı SHA-1 sağlama toplamını verecek yalnızca 1 oyuncu değişikliği olduğundan emin olmak için tüm olasılıkları denemeyi beklemelisiniz.

Şimdi IMPOSSIBLE , "bir WORTHWHILE zamanında mümkün değil" gibi geliyor .


Nasıl devam

Teknik sorunuza daha doğru bir cevap: kaba kuvvet hakkında konuşurken, kaba kaba kuvvet gerekmek zorunda değildir.

  • Sadece bir cevapta, diğer cevapta yolsuzluktan önceki kısımda sha1 sağlama toplamını hesaplamanıza gerek olmadığı belirtilmiştir. İlk seferde yaparsınız ve art arda gelen her yineleme için zaman kazanırsınız (belki de pozisyona bağlı bir faktör 2).

  • Bu çabanın değersizliğini değiştirebilecek bir şey GPU'da çalışacak paralel bir kod yazmaktır . İyi bir grafik kartınız varsa, sizin için paralel olarak hesaplayabileceğiniz yaklaşık 1000 çekirdeğiniz olabilir (daha da fazla fakat cpu'dan daha düşük bir frekansa sahipler, ancak yine de çoktur). Süreyi 1400'den 1.4 güne düşürebiliyorsanız, belki de yapabilirsiniz.

  • Bir başka yaklaşım daha hızlı bir çözüme doğru yol açabilir.
    Bir rar dosyası olduğunu söyledin. Rar dosyasının yapısı bloklara bölünür. Bunları hesaba katarsanız, yolsuzluğun nerede olduğunu görebilirsiniz. Verilerin kısmında, başlıkların kısmında veya her ikisinde. Sonra sonuç olarak hareket edebilirsiniz. Sadelik açısından, verilerin bittiğini varsayalım:
    ofsetinizin kaba kuvvetini yapabilir, tüm dosyadaki SHA1 bile pozitifse, o bloğun her bir pozitif CRC'sini kontrol edebilirsiniz. Yine bir paralel kod yapabilirsiniz.

Son not

4 yerine 6 bayt olsaydı, şu andaki teknolojiyle oyunun dışındaydın.


Büyük cevap - bir kişi tüm alanı tüketmek zorunda kalmayacaktır, çünkü bu örnekteki rar, sha1 yinelenen bir karma ile çalışsa bile, iç kontroller nedeniyle açılmaz. Sha1'i yanlış çözen 4 byte'a çarpmak VE bir dahili crc'yi yanlış yapmak çok düşük bir ihtimal.
rrauenza

@rrauenza Teşekkürler. Btw sadece (çift kontrol). Aslında, blok daha sonra bozuk bayttan dosyanın sonuna kadar bütün kısım daha kısa olmalı ve CRC daha sonra sha1 algoritmasını hesaplamak için daha hafif olmalıdır ...
Hastur

@rrauenza GPU'da çalıştırmak için gerçek paralel kodu alma konusunda nasıl gideceğimi biliyor musunuz? İyi bir GPU'm var. Teşekkürler.
Sbt19

Hayır. Yine de arama alanını bölümlere ayırarak birden fazla cpus kullanabilirsiniz.
rrauenza

@ Sbt19 Bu konuda size ne dedilerse google kullanmak çok korkutucu değil ;-). Arayın (eğer nvidia'da) Cuda, brute force, sha1ve bir çok ipucunuz olacak, örneğin kaynak kodu . Çünkü BTW dikkatinizi yüksek tutmak olduğunu google yolundan gezen, ah evladım filenin karanlık yüzlerinden birine götürebilir ... :-). (Github'da değil ... başka bir sitede bu tür araştırmalarla tanışabilirsiniz). PS> İlgili konularda çok sayıda bilimsel makale var, örneğin bu ...
Hastur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.