দূষিত ফাইলটি পুনরুদ্ধার করতে স্বয়ংক্রিয়ভাবে কয়েকটি বাইট 'ব্রুট ফোর্স'


35

এর বাইরে যে কেউ একটি ফাইলের একটি নির্দিষ্ট অফসেটে মান জোর করার কোনও উপায় জানেন? এটি টানা 4 বাইট যা জোর করে জোর করা দরকার। আমি দূষিত ফাইলটির সঠিক SHA-1 জানি। সুতরাং, আমি যা করতে চাই তা সম্পূর্ণ ফাইল SHA-1 এর সাথে তুলনা করা হয়, প্রতিবার এটি বাইট মান পরিবর্তন করে।

আমি ঠিক 4 টি বাইট জানি যা পরিবর্তন করা হয়েছিল, কারণ ফাইলটি আমাকে একটি পুনরুদ্ধারের চ্যালেঞ্জ হিসাবে একটি ডেটা রিকভারি বিশেষজ্ঞ দিয়েছিল। যারা জানতে আগ্রহী তাদের জন্য, রার ফাইলটিতে 4 বাইট রয়েছে যা ইচ্ছাকৃতভাবে পরিবর্তন করা হয়েছিল। আমাকে পরিবর্তিত 4 বাইট এবং মূল SHA-1 এর অফসেটগুলি বলা হয়েছিল। ব্যক্তিটি বলেছিল যে একবার 4 টি বাইট পরিবর্তন করা গেলে সংরক্ষণাগারে সঠিক ফাইলটি পুনরুদ্ধার করা অসম্ভব। এমনকি যদি এটি কয়েক বাইট ছিল এবং আপনি ঠিক জানতেন দুর্নীতিটি কোথায় অবস্থিত। যেহেতু এটির পুনরুদ্ধার রেকর্ড নেই। আমি চেষ্টা করছি যে particular নির্দিষ্ট 4 বাইট সঠিকভাবে পূরণ করার কোনও উপায় আছে যাতে ফাইলটি ত্রুটি ছাড়াই সঙ্কুচিত হয়ে যায়। ফাইলের আকার প্রায় 5 এমবি।

উদাহরণ :

আমি ফটোগুলি আপলোড করেছি যাতে আমি যা করতে চাই ঠিক এটির আরও স্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে। আমি বিশ্বাস করি যে কেউ আমার কাছে আরও সুনামের সাথে পোস্ট করতে পারে।

স্ক্রিনশট এক

স্ক্রিনশট দুটি

আমি যে অফসেটটির উপরে ফোকাস করছি সেটিকেই 0x78প্রথম চিত্রটি দেখায় যেখানে CA আমি স্ক্রিপ্টটি মানটি 1 করে নিতে চাই যাতে এটি CBদ্বিতীয় ছবিতে প্রদর্শিত হয়। আমি এটির মাধ্যমে মানটি বাড়িয়ে তুলতে চাই 1এবং তারপরে প্রতিবার পুরো ফাইলটি SHA-1 এর সাথে তুলনা করি। নির্দিষ্ট অফসেটে কেবল সেই 4 বাইটে পরিবর্তন করা।

এটি চেষ্টা করবে CAC5C58Aএবং SHA-1 এর সাথে তুলনা করবে। তাহলে সাথে মেলে না, তাহলে এটি চেষ্টা করবে CBC5C58Aএকবার প্রথম মান পৌছানোর .Then FFতাহলে যেতে হবে 00C6C58Aইত্যাদি। মূলত, আমি এটি থেকে যেতে সক্ষম হতে চাই 00000000-FFFFFFFFতবে আপনি এটি শুরু এবং শেষ কোথায় চান তা চয়ন করার বিকল্প থাকতে পারে। আমি জানি এটি কিছু সময় নিতে পারে তবে আমি এটি চেষ্টা করতে চাই। মনে রাখবেন আমি যে বাইটগুলি দূষিত তার সঠিক অফসেট জানি। আমার শুধু সঠিক মান দরকার।

আপনি যদি গুগলে অনুসন্ধান করেন: "কীভাবে নৃশংস বাহিনী দ্বারা একটি দূষিত ফাইল ফিক্স করা যায়" এমন একজন ব্যক্তি আছেন যা লিনাক্স প্রোগ্রাম লিখেছিলেন। তবে এটি প্রোগ্রামের সাথে অন্তর্ভুক্ত ফাইলগুলির বিরুদ্ধে কাজ করে। আমি আমার ফাইলটি দিয়ে একই প্রক্রিয়াটি ব্যবহার করার জন্য কিছু উপায় খুঁজছি।


3
সুপার ব্যবহারকারীকে স্বাগতম! কোনও প্রোগ্রামের অনুরোধটি সরিয়ে দিতে আমি আপনার প্রশ্ন সম্পাদনা করেছি, যা অফ-টপিক হবে। আপনি যে উদাহরণগুলি দেখেছেন (সেগুলির মধ্যে কয়েকটি) অন্তর্ভুক্ত করতে আপনি কি আপনার প্রশ্ন সম্পাদনা করতে পারেন ? এটি ভাল যে আপনি গবেষণা করেছেন, তবে ঠিক কী গবেষণাটি সহায়ক হবে তা আমাদের দেখিয়ে দিচ্ছেন :)
বেরিটিব

20
আমি কী জিজ্ঞাসা করতে পারি যে আপনি এই ফাইলটি শেষ করেছেন কীভাবে এবং আপনি কীভাবে নিশ্চিত হতে পারেন যে কেবলমাত্র 4 টি দুর্নীতিবাজ বাইট রয়েছে?
এডোয়ার্ডো

1
আপনি ফাইল ফর্ম্যাট জানেন? আপনি যদি তা করেন তবে আপনি জোর করার চেষ্টা করার চেয়ে সঠিক মানগুলি বা সীমার সীমাবদ্ধ করতে সক্ষম হতে পারেন। তবে সাধারণভাবে, আমি পরামর্শ দিচ্ছি যে কোনও দূষিত ফাইলটি সুরক্ষার কারণে ডাম্প করা উচিত।
স্টিফেনজি

11
@ অ্যাডিস আমি আপনার প্রশ্নের দ্বিতীয় অংশে সত্যই আগ্রহী - কেন এই 4 বাইট?
ক্রেগ ওটিস

2
কৌতূহলের বাইরে, ফাইলটি কীভাবে দুর্নীতিগ্রস্থ হল? এবং আপনি কীভাবে জানবেন যে এই চারটি বাইট ছিল?
জনএই

উত্তর:


27

এখানে একটি ছোট পাইথন প্রোগ্রাম যা আপনাকে যা বলে মনে হচ্ছে তা করে।

#!/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 / এ / 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 = ...

কিন্তু তারপর আপনি নিশ্চিত করার জন্য প্রয়োজন হবে নিজেকে যে (শুরু, শেষ) মধ্যে জোড়া rge0x00000000 এবং 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:]

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
মজুর গিক

4

না, না, না এবং না আবার!

খুব কমই উত্তর পেয়ে যাবেন আপনি যা আশা করেন তা নয়।

আপনার জন্য কিছু প্রশ্ন:

  • এটি কী সম্ভব যে কোনও বিশেষজ্ঞ জানেন না যে বাইটের জন্য একটি স্ট্রিং জোর করা সম্ভব এবং পুনরায় রূপান্তর না হওয়া পর্যন্ত এসএইচএ -১ চেষ্টা করুন? না
  • এটা কি সে ভুলে যেতে পারে? না
  • আপনি কি এটি আরআর ফাইল ব্যবহার করতে পারবেন না এমনটা সম্ভব? না
  • কি অন্যান্য উত্তর ভুল? একেবারে না

তাতে কি? ... সময়

মুল বক্তব্যটি হ'ল আপনাকে এতগুলি বাইট পরিবর্তন করতে হবে ... মাত্র 4!

এর মানে কি? 256 4 যা 256x256x256x256 সম্ভাবনা, সত্যই একটি বড় সংখ্যা।
যদি আপনার কম্পিউটারটি প্রতি সেকেন্ডে 1 টি অপারেশন প্রক্রিয়া করতে সক্ষম হয় (ফাইলটিতে + sha1 প্রতিস্থাপন) ...
আপনার আরও 136 বছর অপেক্ষা করা উচিত , অথবা আপনি যদি আরও 49710 দিনের বেশি পছন্দ করেন।

আপনি যথেষ্ট ভাগ্যবান, একটি 5MB প্রি-ক্যাশেড ফাইল (ইতিমধ্যে রাম এবং ক্যাশে লোড হওয়া) একটি পুরানো কম্পিউটারে কেবলমাত্র 0.03 সেকেন্ড (কমপক্ষে 0.025s) জিজ্ঞাসা করে। এটি আপনার প্রত্যাশিত সময়কে 1242-1492 দিন (3 বছর পরে আরও কিছু) কমিয়ে দেবে।

এটি সত্য, বিটিডাব্লু, যে পরিসংখ্যানগত দিক থেকে আপনার অর্ধেক সময়ের মধ্যে ইতিবাচক উত্তর হওয়া উচিত । তবুও আপনার অপেক্ষা করা উচিত যতক্ষণ না আপনি সমস্ত সম্ভাবনা চেষ্টা করে দেখতে নিশ্চিত হন যে কেবলমাত্র 1 টি প্রতিস্থাপন রয়েছে যা আপনাকে একই SHA-1 চেকসাম দেবে ...

এখন যে IMPOSSIBLE শোনাচ্ছে " সময়ের পরিমাণে সম্ভব নয় "।


কিভাবে এগিয়ে যেতে হবে

আপনার প্রযুক্তিগত প্রশ্নের আরও সঠিক উত্তর: আপনি যখন ব্রুট ফোর্সের কথা বলেন তখন এটি প্রয়োজনীয় অন্ধ ব্রুট ফোর্স হওয়ার দরকার নেই।

  • অন্য উত্তরের একটি মন্তব্যে এটি কেবলমাত্র বলা হয়েছে যে দুর্নীতির আগে আপনার পক্ষ থেকে sha1 চেকসাম গণনা করার দরকার নেই। আপনি 1 ম বার করেন এবং আপনি প্রতিটি ক্রমাগত পুনরাবৃত্তির জন্য সময় সাশ্রয় করেন (সম্ভবত কোনও ফ্যাক্টর 2 এটি অবস্থান থেকে নির্ভর করে)।

  • প্রয়াসের মূল্যহীন কিছু এমন পরিবর্তন করতে পারে যা জিপিইউতে চলতে পারে এমন একটি সমান্তরাল কোড লিখতে হয়। আপনার যদি একটি ভাল গ্রাফিক কার্ড থাকে তবে আপনার কাছে প্রায় 1000 টি কোর থাকতে পারে যা আপনার জন্য সমান্তরালভাবে গণনা করতে পারে (আরও বেশি তবে তাদের সিপিইউ এর চেয়ে কম ফ্রিকোয়েন্সি কম থাকে, তবে তারা অনেক বেশি)। আপনি যদি 1400 থেকে 1.4 দিন সময় কমিয়ে আনতে সক্ষম হন তবে আপনি এটি করতেও পারেন।

  • একটি ভিন্ন দৃষ্টিভঙ্গি আপনাকে দ্রুত সমাধানের দিকে নিয়ে যেতে পারে।
    আপনি বলেছিলেন এটি একটি আরআর ফাইল। RAR ফাইলের গঠন ব্লক বিভক্ত করা হয়। আপনি যদি এটির গণনা করেন তবে দেখতে পাবেন দুর্নীতি কোথায় পড়ে। যদি এটি ডেটার অংশে থাকে তবে শিরোনামের অংশে বা উভয় ক্ষেত্রে। তারপরে আপনি ফলস্বরূপ অভিনয় করতে পারেন। সরলতার জন্য ধরে নেওয়া যাক এটি ডেটা ছাড়িয়ে গেছে:
    আপনি আপনার অফসেটের ব্রুট ফোর্সটি করতে পারেন, সেই ব্লকের প্রতিটি পজিটিভ সিআরসি পরীক্ষা করুন যদি এটি সম্পূর্ণ ফাইলে SHA1 এমনকি ইতিবাচক হয়। আবার আপনি একটি সমান্তরাল কোড করতে পারেন।

চূড়ান্ত নোট

যদি তারা 4 এর পরিবর্তে 6 বাইট হয় তবে আপনি বর্তমান প্রযুক্তি দিয়ে গেমের বাইরে ছিলেন।


দুর্দান্ত উত্তর - একজনকে অগত্যা পুরো স্থানটি নিঃশেষ করার প্রয়োজন হবে না কারণ এই উদাহরণে রার নিজেই অভ্যন্তরীণ চেকগুলির কারণে সঙ্কলিত হবে না এমনকি শে 1 নকল হ্যাশ দিয়ে কাজ করলেও। 4 টি বাইট হিট করা যা sha1 টি মিথ্যাভাবে সমাধান করেছে এবং একটি অভ্যন্তরীণ crc মিথ্যাভাবে খুব সম্ভবত অসম্ভব হবে।
rrauenza

ধন্যবাদ। বিটিডাব্লু শুধুমাত্র (ডাবল চেক) নয়। প্রকৃতপক্ষে ব্লকটি সংক্ষিপ্ততর হওয়া উচিত ফাইলের শেষে দূষিত বাইটগুলি থেকে পুরো অংশটি, এবং সিআরসি হালকা হওয়া উচিত তারপরে sha1 অ্যালগরিদম ...
হস্তুর

@ রারাউঞ্জা আপনি কি জানেন যে আমি কীভাবে জিপিইউতে চালানোর জন্য আসল সমান্তরাল কোড পাব? আমার একটা ভাল জিপিইউ আছে। ধন্যবাদ।
এসবিটি 19

না আমি করিনি. আপনি যদিও অনুসন্ধানের স্থানটি বিভাজন করে একাধিক সিপাস ব্যবহার করতে পারেন।
ruuenza

@ এসবিটি 19 তারা আপনাকে এটি সম্পর্কে যা বলেছিল তা গুগল ব্যবহার করা এতটা ভীতিজনক নয় ;-)। অনুসন্ধান করুন (যদি এনভিডিয়া হয়) Cuda, brute force, sha1এবং আপনার কাছে প্রচুর ইঙ্গিত থাকবে, যেমন উত্স কোড । কারণ BTW আপনার মনোযোগ উচ্চ রাখা যে Google পথ থেকে ব্রাউজিং, ও আমার ছেলে, তুমি নেট অন্ধকার পক্ষের এক হতে পারে ... :-)। (গিথুব নয় ... অন্যান্য সাইটে আপনি এই ধরণের গবেষণার সাথে দেখা করতে পারেন)। PS> সম্পর্কিত বিষয়ে প্রচুর বৈজ্ঞানিক কাগজপত্র রয়েছে, যেমন এটি একটি ...
হাস্তুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.