Tự động 'vũ phu' một vài byte để khôi phục tệp bị hỏng


35

Có ai ở ngoài đó biết một cách để vũ phu các giá trị ở một độ lệch cụ thể trong một tệp không? Đó là 4 byte liên tiếp cần phải được ép buộc. Tôi biết đúng SHA-1 của tệp bị hỏng. Vì vậy, những gì tôi muốn làm là so sánh tệp SHA-1 hoàn chỉnh, mỗi lần nó thay đổi giá trị byte.

Tôi biết chính xác 4 byte đã được thay đổi, bởi vì một chuyên gia phục hồi dữ liệu đã được trao cho tôi, như là một thách thức phục hồi. Đối với những người quan tâm muốn biết, tệp rar có 4 byte được thay đổi có chủ ý. Tôi được cho biết là độ lệch của 4 byte đã thay đổi và SHA-1 ban đầu. Người này nói rằng KHÔNG THỂ khôi phục tệp chính xác trong kho lưu trữ sau khi 4 byte được thay đổi. Ngay cả khi đó chỉ là một vài byte và bạn biết chính xác vị trí của tham nhũng. Vì nó không có hồ sơ phục hồi. Tôi đang cố gắng xem liệu có cách nào để 4 byte cụ thể đó được điền chính xác để tệp sẽ giải nén mà không gặp lỗi hay không. Kích thước tập tin khoảng 5mb.

Ví dụ :

Tôi đã tải lên các bức ảnh để nó được xác định rõ ràng hơn về chính xác những gì tôi đang làm. Tôi tin rằng ai đó có thể đăng chúng ở đây cho tôi với nhiều đại diện hơn.

Ảnh chụp màn hình Một

Ảnh chụp màn hình Hai

Ví dụ bù mà tôi đang tập trung vào là 0x78nơi pic đầu tiên hiển thị giá trị vì CA tôi muốn tập lệnh tăng giá trị lên 1 để nó trở thành CBnhư thể hiện trong pic thứ hai. Tôi muốn nó tiếp tục tăng giá trị 1và sau đó so sánh toàn bộ tệp SHA-1 mỗi lần. Chỉ thực hiện thay đổi đối với 4 byte đó ở phần bù được chỉ định.

Nó sẽ thử CAC5C58Avà so sánh SHA-1. Nếu không khớp, thì nó sẽ thử. CBC5C58ASau đó, khi giá trị đầu tiên đạt đến, FFnó sẽ chuyển sang 00C6C58Avà cứ tiếp tục như vậy. Về cơ bản, tôi muốn nó có thể đi từ 00000000-FFFFFFFFnhưng cũng có tùy chọn để chọn nơi bạn muốn nó bắt đầu và kết thúc. Tôi biết nó có thể mất một chút thời gian nhưng tôi vẫn muốn thử nó. Hãy nhớ rằng tôi biết phần bù chính xác của các byte bị hỏng. Tôi chỉ cần các giá trị chính xác.

Nếu bạn tìm kiếm trên Google: "Cách sửa tệp bị hỏng bằng vũ lực" Có một người đã viết chương trình Linux. Tuy nhiên, nó chỉ hoạt động đối với các tệp có trong chương trình. Tôi đang tìm cách nào đó để sử dụng cùng một quy trình với tệp của mình.


3
Chào mừng bạn đến với Siêu người dùng! Tôi đã chỉnh sửa câu hỏi của bạn để xóa yêu cầu cho một chương trình, sẽ không có chủ đề. Bạn có thể chỉnh sửa câu hỏi của bạn để bao gồm (một số) các ví dụ bạn đã thấy không? Thật tốt khi bạn đã thực hiện nghiên cứu, nhưng cho chúng tôi thấy chính xác nghiên cứu nào sẽ hữu ích :)
bertieb

20
Tôi có thể hỏi làm thế nào bạn kết thúc với tập tin này và làm thế nào bạn có thể chắc chắn rằng đó là 4 byte bị hỏng duy nhất?
Edoardo

1
Bạn có biết định dạng tập tin? Nếu bạn làm, bạn có thể tìm ra các giá trị chính xác hoặc giới hạn phạm vi, thay vì cố gắng ép buộc chúng. Tuy nhiên, nói chung, tôi đề nghị bất kỳ tệp bị hỏng nào nên được đổ vì lý do bảo mật.
StephenG

11
@eddyce Tôi thực sự quan tâm đến phần thứ hai của câu hỏi của bạn - tại sao 4 byte đó?
Craig Otis

2
Vì tò mò, làm thế nào để tập tin bị hỏng? Và làm thế nào để bạn biết đó là bốn byte?
JohnEye

Câu trả lời:


27

Đây là một chương trình Python nhỏ thực hiện những gì bạn dường như đang mô tả.

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

UnChỉ thử nghiệm ngắn gọn ; xin vui lòng ping tôi nếu bạn tìm thấy lỗi chính tả.

Chỉ baseđịnh nơi cố gắng áp dụng bốn byte và chuỗi dài '996873... là biểu diễn hex của SHA1 dự kiến. Dòng for seq in... xác định các byte để thử; và tất nhiên thay thế 'binaryfile'bằng đường dẫn đến tệp bạn muốn cứu.

Bạn có thể thay thế danh sách theo nghĩa đen [[0xCA, 0xC5,... ]]bằng thứ gì đó thực sự lặp lại trên tất cả các giá trị có thể nhưng về cơ bản nó chỉ là một trình giữ chỗ cho thứ gì đó hữu ích hơn vì tôi không thực sự chắc chắn chính xác bạn muốn gì ở đó.

Một cái gì đó giống như for seq in itertools.product(range(256), repeat=4)):sẽ lặp lại trên tất cả các giá trị có thể từ 0 đến 2 32 -1. (Sau đó, bạn sẽ cần thêm import itertoolsgần đầu.) Hoặc có lẽ bạn chỉ cần thêm một phần bù; cập nhật tập lệnh để thay thế dòng hiện tại for seq inbằng cách sau (một lần nữa importcần phải đi trước chương trình chính);

import struct

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

Tôi đảo ngược thứ tự của các byte để nó tự nhiên gia tăng từ 0x8AC5C5CA để 0x8AC5C5CB nhưng sau đó tăng tiếp theo sẽ là 0x8AC5C5CC vv structkỳ diệu là để chuyển đổi này cho một chuỗi các byte (phải bất lực nhìn nó lên từ https: // stackoverflow. com / a / 26920983/874188 ). Điều này sẽ bắt đầu tại 0x8AC5C5CA và chuyển đến 0xFFFFFFFF, sau đó quấn quanh 0x00000000 và leo lên tới 0x8AC5C5C9.

Nếu bạn có nhiều phạm vi ứng cử viên, bạn muốn kiểm tra theo một thứ tự cụ thể, có thể là một cái gì đó như

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

nhưng sau đó bạn sẽ cần phải chắc chắn rằng mình rằng (bắt đầu, kết thúc) cặp trong rgebìa tất cả các khoảng trống giữa 0x00000000 và 0xFFFFFFFF nếu bạn thực sự muốn kiểm tra tất cả của nó. (Và một lần nữa, lưu ý rằng phạm vi tăng byte cuối cùngseqáp dụng các byte của giá trị ngược lại, phù hợp với các yêu cầu đã nêu của bạn.)

Nếu bạn muốn sử dụng hai baseđịa chỉ khác nhau , bạn sẽ nhanh chóng vượt qua giới hạn của những gì khả thi để thực hiện trong cuộc đời mình bằng vũ lực; nhưng bạn có thể, ví dụ, chia số 4 byte thành hai phần 2 byte và áp dụng các phần đó ở các độ lệch khác nhau.

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

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Journeyman Geek

4

Không, không, không và một lần nữa KHÔNG!

Ít khi câu trả lời bạn nhận được không như bạn mong đợi.

Một số câu hỏi cho bạn:

  • Có thể là một chuyên gia không biết rằng có thể vũ trang một chuỗi các byte và lặp lại thử SHA-1 cho đến khi nó hội tụ? Không
  • Có thể anh ấy quên nó? Không
  • Có thể là bạn không thể làm điều đó trên một tập tin rar? Không
  • câu trả lời khác sai? hoàn toàn KHÔNG

Vậy thì sao? ... Thời gian.

Vấn đề là bạn phải thay đổi rất ít byte ... chỉ có 4!

Nó có nghĩa là gì? 256 4 đó là khả năng 256x256x256x256, một con số thực sự rất lớn.
Nếu máy tính của bạn có thể xử lý 1 thao tác mỗi giây (thay thế trong tệp + sha1) ...
bạn nên đợi hơn 136 năm hoặc nếu bạn thích hơn 49710 ngày.

Bạn đủ may mắn, một tệp được lưu trước 5 MB (đã được tải trong ram và trong bộ đệm) chỉ yêu cầu khoảng 0,03 giây (tối thiểu 0,025 giây), trên một máy tính cũ. Điều đó thu hẹp thời gian mong đợi của bạn xuống còn 1242-1492 ngày (khoảng hơn 3 năm).

Đó là sự thật, BTW, theo thống kê, bạn nên có câu trả lời tích cực trong một nửa thời gian . Tuy nhiên, bạn nên đợi cho đến khi bạn đã thử tất cả các khả năng để chắc chắn rằng chỉ có 1 sự thay thế sẽ cung cấp cho bạn tổng kiểm tra SHA-1 tương tự ...

Bây giờ IMPOSSIBLE âm thanh như "không thể trong một giá trị số lượng thời gian".


Làm thế nào để tiến hành

Một câu trả lời thích hợp hơn cho câu hỏi kỹ thuật của bạn: khi bạn nói về lực lượng vũ phu, nó không phải là lực lượng vũ phu mù quáng cần thiết.

  • Nó chỉ được nêu trong một nhận xét trong câu trả lời khác rằng bạn không cần phải tính toán tổng kiểm tra sha1 trên phần trước khi tham nhũng. Bạn làm lần đầu tiên và bạn tiết kiệm thời gian cho mỗi lần lặp liên tiếp (có thể là yếu tố 2, nó phụ thuộc vào vị trí).

  • Một cái gì đó có thể thay đổi vô giá trị của nỗ lực là viết một mã song song sẽ chạy trên GPU. Nếu bạn có một card đồ họa tốt, bạn có thể có khoảng 1000 lõi có thể tính toán cho bạn song song (thậm chí nhiều hơn nhưng chúng có tần số thấp hơn cpu, nhưng chúng vẫn rất nhiều). Nếu bạn có thể giảm thời gian từ 1400 xuống 1,4 ngày, thậm chí bạn có thể làm điều đó.

  • Một cách tiếp cận khác nhau có thể dẫn bạn đến một giải pháp nhanh hơn.
    Bạn nói nó là một tập tin rar. Các cấu trúc file rar được chia thành các khối. Nếu bạn đếm nó, bạn có thể thấy tham nhũng rơi ở đâu. Nếu nó nằm trên một phần của dữ liệu, trên một phần của các tiêu đề hoặc trên cả hai. Sau đó, bạn có thể hành động do đó. Để đơn giản, hãy giả sử rằng đó là dữ liệu:
    bạn có thể thực hiện các biện pháp bù trừ bù trừ của mình, kiểm tra từng CRC dương của khối đó nếu nó thậm chí dương SHA1 trên toàn bộ tệp. Một lần nữa bạn có thể làm một mã song song.

Lưu ý cuối cùng

Nếu chúng là 6 byte thay vì 4 thì bạn đã ra khỏi trò chơi với công nghệ hiện tại.


Câu trả lời tuyệt vời - người ta không nhất thiết phải làm cạn kiệt toàn bộ không gian bởi vì bản thân rar trong ví dụ này sẽ không giải nén do kiểm tra nội bộ ngay cả khi sha1 hoạt động với hàm băm trùng lặp. Đánh 4 byte đã giải quyết sha1 sai và một crc bên trong giả sẽ rất khó xảy ra.
rrauenza

@rrauenza Cảm ơn. BTW không chỉ (kiểm tra kép). Thật vậy, khối phải ngắn hơn sau đó toàn bộ phần từ các byte bị hỏng đến cuối tệp và CRC sẽ nhẹ hơn để tính toán thuật toán sha1 ...
Hastur

@rrauenza Bạn có biết làm thế nào tôi có thể lấy mã song song thực tế để chạy trên GPU không? Tôi có một GPU tốt. Cảm ơn.
Sbt19

Không, tôi không làm. Bạn có thể sử dụng nhiều cpus bằng cách phân vùng không gian tìm kiếm mặc dù.
rrauenza

@ Sbt19 Bất cứ điều gì họ nói với bạn về điều đó, google sẽ không quá đáng sợ khi sử dụng ;-). Tìm kiếm (nếu nvidia) Cuda, brute force, sha1và bạn sẽ có rất nhiều gợi ý, ví dụ mã nguồn . BTW giữ cao sự chú ý của bạn bởi vì xem từ con đường google, oh my boy, có thể dẫn bạn vào một trong những mặt trái của mạng ... :-). (Không phải trên github ... trong trang web khác mà bạn có thể gặp với loại nghiên cứu này). Tái bút> Có rất nhiều bài báo khoa học về các chủ đề liên quan, ví dụ như bài này ...
Hastur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.