Automaticamente 'força bruta' alguns bytes para recuperar um arquivo corrompido

34

Alguém aí sabe de uma maneira de agregar valores de força em um determinado deslocamento em um arquivo? São 4 bytes consecutivos que precisariam ser forçados brutos. Eu sei o SHA-1 correto do arquivo corrompido. Então, o que eu gostaria de fazer é comparar o arquivo completo SHA-1, cada vez que ele altera o valor do byte.

Eu sei exatamente os 4 bytes que foram alterados, porque o arquivo foi fornecido a mim por um especialista em recuperação de dados, como um desafio de recuperação. Para aqueles que estão interessados em saber, o arquivo rar tem 4 bytes que foram alterados intencionalmente. Disseram-me os deslocamentos dos 4 bytes alterados e o SHA-1 original. A pessoa disse que é IMPOSSÍVEL recuperar o arquivo exato no arquivo assim que os 4 bytes forem alterados. Mesmo que fosse apenas alguns bytes e você soubesse exatamente onde a corrupção estava localizada. Desde que não tenha um registro de recuperação. Eu estou tentando ver se há um caminho para esses 4 bytes em particular para ser preenchido corretamente para que o arquivo será descompactado sem erro. O tamanho do arquivo é de cerca de 5mb.

Exemplo :

Eu fiz o upload de fotos para que seja mais claramente definido exatamente o que estou procurando fazer. Eu acredito que alguém pode postá-los aqui para mim com mais reputação.

Odeslocamentodeexemplonoqualestoumeconcentrandoé0x78,ondeaprimeirafotomostraovalorcomoCAEuqueroqueoscriptaumenteovalorem1,entãoelesetornaCBcomomostradonasegundafoto.Euqueroquecontinueaumentandoovalorem1e,emseguida,comparetodooarquivoSHA-1acadavez.Apenasfazendoalteraçõesnesses4bytesnodeslocamentoespecificado.

EletentaráCAC5C58AecompararáoSHA-1.Senãocorresponder,eletentaráCBC5C58A.DepoisqueoprimeirovaloratingirFF,elepassarápara00C6C58Aeassimpordiante.Basicamente,eugostariaquefossepossívelirde00000000-FFFFFFFFmastambémteraopçãodeescolherondevocêquercomeçareterminar.Euseiquepoderialevaralgumtempo,maseuaindagostariadetentar.Tenhaemmentequeeuseiodeslocamentoexatodosbytesqueestãocorrompidos.Eusóprecisodosvalorescorretos.

SevocêpesquisarnoGoogle:"Como corrigir um arquivo corrompido pela força bruta" Há uma pessoa que escreveu um programa do Linux. No entanto, só funciona contra os arquivos incluídos no programa. Estou procurando uma maneira de usar o mesmo processo com meu arquivo.

    
por Sbt19 19.04.2018 / 12:14

2 respostas

27

Aqui está um pequeno programa em Python que faz o que você parece estar descrevendo.

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

Un Apenas brevemente testado; por favor ping me se você encontrar erros de digitação.

O base especifica onde tentar aplicar os quatro bytes e a longa string '996873 ... é a representação hexadecimal do SHA1 esperado. A linha for seq in ... define os bytes para tentar; e, é claro, substitua 'binaryfile' pelo caminho para o arquivo que você deseja tentar salvar.

Você pode substituir a lista literal [[0xCA, 0xC5, ... ]] por alguma coisa para realmente fazer o loop de todos os valores possíveis, mas é basicamente apenas um espaço reservado para algo mais útil, porque não sei exatamente o que você quer lá.

Algo como for seq in itertools.product(range(256), repeat=4)): apresentará todos os valores possíveis de 0 a 2 32 -1. (Você precisará adicionar import itertools próximo ao topo.) Ou talvez você possa simplesmente adicionar um deslocamento; atualize o script para substituir o atual for seq in pelo seguinte (onde novamente o import precisa ir antes do programa principal);

import struct

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

Eu inverti a ordem dos bytes para que ela incremente naturalmente de 0x8AC5C5CA para 0x8AC5C5CB, mas o próximo incremento será 0x8AC5C5CC etc. A struct magic é converter isso em uma seqüência de bytes (tive que procurá-la a partir de link ). Isso iniciará em 0x8AC5C5CA e irá para 0xFFFFFFFF, então, contorna 0x00000000 e volta para 0x8AC5C5C9.

Se você tiver vários intervalos de candidatos que gostaria de examinar em uma ordem específica, talvez algo como

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

mas você precisará certificar-se de que os pares (início, fim) em rge cobrem todo o espaço entre 0x00000000 e 0xFFFFFFFF se você realmente quiser examinar tudo isso . (E, novamente, observe que o intervalo incrementa o byte último e que seq aplica os bytes do valor em ordem inversa, de acordo com seus requisitos declarados.)

Se você quisesse usar dois endereços base diferentes, você rapidamente se depararia com os limites do que é viável fazer em sua vida com força bruta; mas você poderia, por exemplo, dividir o número de 4 bytes em duas partes de 2 bytes e aplicá-las em diferentes deslocamentos.

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:]
    
por 19.04.2018 / 12:52
4

Não, não, não e novamente NÃO!

raramente a resposta que você recebe não é o que você espera.

Algumas perguntas para você:

  • É possível que um expert não saiba que é possível forçar uma string de bytes brutos e tentar iterativamente o SHA-1 até convergir? Não
  • É possível que ele esqueça? Não
  • É possível que você não possa fazer isso em um arquivo rar? Não
  • A outra resposta está errada? absolutamente NÃO

Então, o que? ... Tempo.

O ponto é que você tem que mudar tão poucos bytes ... apenas 4!

O que isso significa? 256 4 são 256x256x256x256 possibilidades, um número realmente grande.
Se o seu computador foi capaz de processar 1 operação por segundo (substituição no arquivo + sha1) ...
você deve esperar mais de 136 anos , ou se você prefira mais de 49710 dias.

Você tem sorte o suficiente, um arquivo pré-armazenado em cache de 5MB (já carregado no RAM e no cache) pede apenas 0.03 segundos (mínimo 0.025s), em um computador antigo. Isso diminui seu tempo de espera para 1242-1492 dias (algo mais do que 3 anos).

É verdade, BTW, que estatisticamente você deve ter uma resposta positiva na metade do tempo . No entanto, você deve esperar até que tenha tentado todas as possibilidades para ter certeza de que há apenas 1 substituição que lhe dará a mesma soma de verificação SHA-1 ...

Agora que IMPOSSIBLE soa como "não é possível em um período WORTHWHILE ".

Como proceder

Uma resposta mais adequada à sua pergunta técnica: quando você fala de força bruta, não precisa ser força bruta cega.

  • É apenas indicado em um comentário na outra resposta que você não precisa calcular a soma de verificação sha1 na parte antes da corrupção. Você faz a 1ª vez e economiza tempo para cada iteração sucessiva (talvez um fator 2 depende da posição).

  • Algo que pode alterar o valor do esforço é escrever um código paralelo que será executado na GPU. Se você tem uma boa placa gráfica, você pode ter cerca de 1000 núcleos que podem calcular para você em paralelo (ainda mais, mas eles têm uma freqüência menor do que a CPU, mas ainda assim são muito). Se você é capaz de diminuir o tempo de 1400 para 1,4 dias, talvez você possa até mesmo fazê-lo.

  • Uma abordagem diferente pode levar você a uma solução mais rápida.
    Você disse que é um arquivo rar. A estrutura do arquivo rar é dividida em blocos. Se você levar em conta, você pode ver onde a corrupção cai. Se estiver na parte dos dados, na parte dos cabeçalhos ou em ambos. Então você pode agir consequentemente. Por uma questão de simplicidade, vamos supor que é sobre os dados:
    você pode fazer a força bruta do seu offset, verificar por cada CRC positivo desse bloco se é positivo o SHA1 em todo o arquivo. Mais uma vez você pode fazer um código paralelo.

Nota final

Se eles tivessem 6 bytes em vez de 4, você estaria fora do jogo com a tecnologia atual.

    
por 20.04.2018 / 17:11