0

誰もが次のアセンブリ コードにいくつかの洞察を提供できますか:

詳しくは:

ブートローダーは、実際には、Xor 復号化を使用して解読する小さな 16 ビット ブートローダーであり、より大きなものであり、セクター 3 から 34 にある Linux ブートローダーです (1 セクターは、そのディスクでは 512 バイトです)。

全体が、組み込み Linux で実行される exec の保護システムです。

保護が削除されたバージョンには、Linux ブートローダーが既に解読されているため (IDA を使用して元に戻すことができました)、保護のないバージョンでは xor キーをゼロでのみ作成する必要があると想定しています。

保護が削除されたバージョンのオフセット 0x800 から 0x8FF を見ると、ゼロで埋められていないため、これをキーにすることはできません。そうしないと、このバージョンをロードできず、プレーン データを xor してゴミしかロードしません。

セクター 3->34 は元のバージョンでは暗号化されており、私たちのバージョンでは暗号化されていません (保護が削除されています) が、MBR コード (小さなプリブートローダー) は両方のバージョンで同一です。

では、MBR のアセンブリ コードに、xor キーの場所をわずかに変更する細部があるのではないでしょうか?

これは単に、アセンブリ コード ローダーをよりよく理解するために行っている演習であり、これを実行するのは非常に困難であることがわかりました。これまでにご意見をお寄せいただきありがとうございます。

4

1 に答える 1

0

アセンブリ コードを読み取るのは大変な作業です。「鍵」はどこから来たのかということだけを答えておきます。

  • BIOS は MBR を 0000:7C00 にロードし、DL をロード元のドライブに設定します。
  • 最初に、MBR は 0000:7C00 から下に伸びるスタックをセットアップします。
  • 次に、それ自体を 0000:0600-0000:07ff にコピーし、次の命令であると想定されるファー ジャンプを実行しますが、コピーされたバージョンでは 0000:061D です。(編集: このコピーは、MBR が通常このアドレスに対して行う非常に標準的なことであり、上記のアドレス空間を解放します) (編集: それ自体を完全にコピーします。私は読み違えてしまいました)。
  • 次に、セクター 2 の 0000:0700-0000:08ff への読み取りを 5 回試行し、失敗した場合はエラー メッセージ (loc_78) で停止します。
  • 次に、セクター 3 から始まる 32 セクターを 2000:0-2000:3FFF (絶対アドレス 20000-23FFF、つまり 128kB から始まる 16kB) に読み込むことを 5 回試みます。
  • すべてがうまくいけば、loc_60 になり、メモリに何があるかがわかります。
  • loc_68 のループは、これらの 32 セクターを保持するバッファーを宛先として使用します。
  • 0000:0800 から始まるバッファーをソースとして使用します (これは、ディスクのセクター 2 の 2 番目の 256 バイトである 0:0700-0:08ff に読み取ったバッファーの 2 番目の 256 バイトです)。
  • 各反復で、LODSW は SI に 2 を加算します。
  • SI が 840 に達すると、AND によって 800 に戻されます。したがって、「キー」バッファは 800 から 83F に移動します。つまり、ディスクのセクタ 2 のバイト 256 から始まる 64 バイトです。
  • XORing が 1 バイト不足している印象があります... CX は 3FFF ではなく 4000h に設定する必要がありました。これはコードのバグだと思います。
  • 物理アドレス 20000 の 16kB バッファーがその「キー」バッファーと循環的に XOR された後、2000:0 へのファー ジャンプでそこにジャンプします。

右?似合う?そこの鍵?

于 2013-06-07T21:39:34.223 に答える