Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
bread — 注入可能なリアルモード x86 デバッガ。BIOSリバースエンジニアリングおよびシリアルケーブルを介した任意のリアルモードコードデバッグ用。GDB統合とハードウェアブレークポイント/ウォッチポイントサポート付き。 | Kitploit
ツール/GitHubGitHub/theldus/bread
リバースエンジニアリングデバッガハードウェアセキュリティバイナリ解析ファームウェア解析
GitHubtheldus/bread

bread

注入可能なリアルモード x86 デバッガ。BIOSリバースエンジニアリングおよびシリアルケーブルを介した任意のリアルモードコードデバッグ用。GDB統合とハードウェアブレークポイント/ウォッチポイントサポート付き。

リポジトリを見る
326183011ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

🍞 BREAD

License: MIT

BREAD(BIOS Reverse Engineering & Advanced Debugger)は、「注入可能な」リアルモード x86 デバッガであり、シリアルケーブルを介して別の PC から任意のリアルモードコード(実際のハードウェア上で)をデバッグできます。

はじめに

BREAD は、レガシー BIOS をリバースエンジニアリングする多くの失敗した試みから生まれました。BIOS 解析の大部分(すべてではないにせよ)は逆アセンブラを使って静的に行われているため、特定のコード片におけるレジスタやメモリの値を知る方法がなく、BIOS を理解することが非常に困難です。

それにもかかわらず、BREAD はブート可能なコードや DOS プログラムなど、リアルモードの任意のコードもデバッグできます。

簡単なデモ:

https://user-images.githubusercontent.com/8294550/217709970-9007a1e3-7352-470d-a22f-cbb5219d5547.mp4

BREAD による CPU 文字列名の変更

動作原理

このデバッガは 2 つの部分に分かれています。デバッガ(完全にアセンブリで書かれ、デバッグ対象のハードウェア上で動作)と、C で書かれ Linux 上で動作するブリッジです。

デバッガは注入可能なコードで、16 ビットリアルモードで記述されており、BIOS ROM や他のリアルモードコード内に配置できます。実行されると、適切な割り込みハンドラを設定し、プロセッサをシングルステップモードにし、シリアルポートでコマンドを待機します。

一方、ブリッジはデバッガと GDB の間のリンクです。ブリッジは TCP 経由で GDB と通信し、リクエスト/レスポンスをシリアルポート経由でデバッガに転送します。ブリッジの背後にある考え方は、GDB パケットの複雑さを取り除き、マシンと通信するためのよりシンプルなプロトコルを確立することです。さらに、シンプルなプロトコルにより最終的なコードサイズを小さくすることができ、デバッガを様々な環境に注入しやすくなります。

次の図のように:

    +---------+ simple packets +----------+   GDB packets  +---------+                                       
    |         |--------------->|          |--------------->|         |                                       
    |   dbg   |                |  bridge  |                |   gdb   |
    |(real HW)|<---------------| (Linux)  |<---------------| (Linux) |
    +---------+    serial      +----------+       TCP      +---------+

機能

GDB スタブを実装しているため、BREAD はすぐに使える多くの機能を持っています。以下のコマンドがサポートされています:

  • メモリ読み取り(x、dump、find および関連コマンド経由)
  • メモリ書き込み(set、restore および関連コマンド経由)
  • レジスタの読み取りと書き込み(registers)
  • シングルステップ(si、stepi)と継続(c、continue)
  • ブレークポイント(b、break)1
  • ハードウェアウォッチポイント(watch およびその仲間)2

GDB シンボル

BIOS のような生のバイナリを GDB でリバースエンジニアリングすると、当然ながら元のシンボルが欠如していることを意味します。しかし、RE プロセスが進むにつれて、ユーザー/プログラマー/ハッカーはコードの特定部分についてより深く理解するようになり、IDA、Cutter、Ghidra などの静的解析ツールでは注釈、コメント、関数定義などを追加できます。これらの強化により、ユーザーの生産性が大幅に向上します。

これを考慮して、プロジェクトには symbolify.py という補助 Python スクリプトが付属しています。シンボルのリスト(アドレス ラベル)を指定すると、これらのシンボルが追加された最小限の ELF ファイルを生成します。この ELF は後で GDB にロードでき、デバッグプロセスを大幅に簡素化するために使用できます。

シンボルファイルには、空白、空行、コメント(#)、およびアドレス行のコメントを含めることができます。アドレスは 10 進数または 16 進数形式で、ラベル/シンボル(1 つ以上の空白文字で区切られる)は [a-z0-9_]+ の形式でなければなりません(実際の例は symbols/ami_ipm41d3.txt にあります):

#
# これはコメントです
#
0xdeadbeef my_symbol1

0x123 othersymbol # この関数は xyz を行います

# 10 進アドレスの例
456 anotherone

使用方法

例えば、symbols/ami_ipm41d3.txt にあるシンボルファイルを考慮すると、ユーザーは次のようにできます:

$ ./simbolify.py symbols/ami_ipm41d3.txt ip41symbols.elf

次に、GDB で次のようにロードします:

(gdb) add-symbol-file ip41symbols.elf 0
add symbol table from file "ip41symbols.elf" at
	.text_addr = 0x0
(y or n) y
Reading symbols from ip41symbols.elf...
(No debugging symbols found in ip41symbols.elf)
(gdb) p cseg_
cseg_change_video_mode_logo  cseg_get_cpuname             
(gdb) p cseg_

GDB のオートコンプリートも期待通りに動作することに注目してください。すごいでしょう?

制限事項

いくつあるかって?たくさんあります。 デバッグ中のコードはデバッグされていることを認識していないため、さまざまな方法でデバッガに干渉する可能性があります。いくつか例を挙げます:

  • プロテクトモードへのジャンプ: デバッグ中のコードがプロテクトモードに切り替わると、割り込みハンドラなどの構造が変更され、デバッガはその時点で呼び出されなくなります。ただし、以前の状態を完全に復元してリアルモードに戻ると、デバッガが再び動作する可能性があります。

  • IDT の変更: 何らかの理由でデバッグ中のコードが IDT またはそのベースアドレスを変更した場合、デバッガハンドラは適切に呼び出されません。

  • スタック: BREAD はスタックを使用し、それが存在することを前提としています!スタックがまだ構成されていない場所に挿入しないでください。

BIOS デバッグの場合、他の制限もあります。例えば、BREAD が正しく動作するためには最低限のセットアップ(RAM など)が必要なため、BIOS コードの最初(ブートブロック)からデバッグすることはできません。ただし、CS:EIP を F000:FFF0 に設定して「ウォームリブート」を実行することは可能です。このシナリオでは、BREAD が適切にロードされているため、BIOS 初期化を再度追跡できます。ウォームリブート時の BIOS 初期化の「コードパス」はコールドリブートとは異なる場合があり、実行フローがまったく同じではない可能性があることに注意してください。

ビルド

ビルドには GNU Make、C コンパイラ(GCC、Clang、TCC など)、NASM、および Linux マシンのみが必要です。

デバッガには 2 つの動作モードがあります: ポーリング(デフォルト)と割り込みベース:

ポーリングモード

ポーリングモードは最も単純なアプローチであり、さまざまな環境でうまく動作するはずです。ただし、ポーリングの性質上、CPU 使用率が高くなります:

ビルド

$ git clone https://github.com/Theldus/BREAD.git
$ cd BREAD/
$ make

割り込みベースモード

割り込みベースモードは、UART 割り込みを使用して新しいデータを受信することで、CPU 使用率を最適化します。これにより、CPU はデバッガからコマンドを受信するまで「停止」状態を維持し、CPU リソースを 100% 消費するのを防ぎます。ただし、割り込みが常に有効であるとは限らないため、このモードはデフォルトでは設定されていません:

ビルド

$ git clone https://github.com/Theldus/BREAD.git
$ cd BREAD/
$ make UART_POLLING=no

使用方法

BREAD を使用するには、シリアルケーブル(そしてそうです、あなたのマザーボードには COM ヘッダーがあります、マニュアルを確認してください)と、適切な場所へのコードの注入のみが必要です。

注入するには、dbg.asm(デバッガのソース)に最小限の変更を加える必要があります。コードの「ORG」を変更し、コードの戻り方を変更する必要があります(変更が必要な場所については、コード内の「>> CHANGE_HERE <<」を探してください)。

BIOS の場合(例: AMI Legacy):

AMI レガシーを例にとると、デバッガモジュールは BIOS ロゴの場所(0x108200 または FFFF:8210)に配置され、ROM 内の以下の命令がモジュールへの far call に置き換えられます:

...
00017EF2  06                push es
00017EF3  1E                push ds
00017EF4  07                pop es
00017EF5  8BD8              mov bx,ax     -┐ 置換後: call 0xFFFF:0x8210 (dbg.bin)
00017EF7  B8024F            mov ax,0x4f02 -┘
00017EFA  CD10              int 0x10
00017EFC  07                pop es
00017EFD  C3                ret
...

次のパッチで十分です:

diff --git a/dbg.asm b/dbg.asm
index caedb70..88024d3 100644
--- a/dbg.asm
+++ b/dbg.asm
@@ -21,7 +21,7 @@
 ; SOFTWARE.
 
 [BITS 16]
-[ORG 0x0000] ; >> CHANGE_HERE <<
+[ORG 0x8210] ; >> CHANGE_HERE <<
 
 %include "constants.inc"
 
@@ -140,8 +140,8 @@ _start:
 
 	; >> CHANGE_HERE <<
 	; Overwritten BIOS instructions below (if any)
-	nop
-	nop
+	mov ax, 0x4F02
+	int 0x10
 	nop
 	nop

ROM 内でデバッガコードを呼び出すためにいくつかの命令を変更した場合、それらはデバッガから戻る前に復元する必要があることに注意することが重要です。

これらの 2 つの命令を置き換える理由は、BIOS がロゴを画面に表示する直前に実行されるためであり、これによりいくつかの重要な点が保証されます:

  • ロゴモジュール(デバッガ)はすでにメモリにロードされている
  • BIOS のビデオ割り込みはすでに動作している
  • 周辺のコードはスタックがすでに存在することを示している

デバッガを呼び出す適切な場所(BIOS が十分に初期化されているが、遅すぎない場所)を見つけるのは難しい場合がありますが、可能です。

この後、dbg.bin は ROM 内の正しい位置に挿入する準備が整います。

DOS の場合

BREAD で DOS プログラムをデバッグするのは少し注意が必要ですが、可能です:

1. DOS が有効な DOS プログラムとして認識するように dbg.asm を編集します:

  • ORG を 0x100 に設定する
  • ファイルの先頭から有用なコードを離しておく(times)
  • プログラムの終了処理(int 0x20)を設定する

次のパッチで対応します:

diff --git a/dbg.asm b/dbg.asm
index caedb70..b042d35 100644
--- a/dbg.asm
+++ b/dbg.asm
@@ -21,7 +21,10 @@
 ; SOFTWARE.
 
 [BITS 16]
-[ORG 0x0000] ; >> CHANGE_HERE <<
+[ORG 0x100]
+
+times 40*1024 db 0x90 ; 距離を保つ,
+                      ; 40kB で十分なはず
 
 %include "constants.inc"
 
@@ -140,7 +143,7 @@ _start:
 
 	; >> CHANGE_HERE <<
 	; Overwritten BIOS instructions below (if any)
-	nop
+	int 0x20 ; DOS 割り込みでプロセスを終了
 	nop

2. 最小限の起動可能な DOS 環境を作成して実行する

カーネルとターミナルだけを含む起動可能な FreeDOS(または DOS)フロッピーイメージを作成します: KERNEL.SYS と COMMAND.COM。このフロッピーイメージに、デバッグするプログラムと DBG.COM(dbg.bin)も追加します。

イメージ作成後、次の手順を実行します:

  • すでに開いている bridge で起動します(次のセクションの指示を参照)。
  • DBG.COM を実行します。
  • 実行が停止したら、GDB を使用して、次にデバッグしたいプロセスに関連する任意のブレークポイントとウォッチポイントを追加します。その後、DBG.COM プロセスが終了するまで続行を許可します。
  • デバッグしたいプロセスを実行します。以前に設定したブレークポイントとウォッチポイントが期待どおりにトリガーされるはずです。

Footnotes

  1. ブレークポイントはハードウェアブレークポイントとして実装されているため、使用可能なブレークポイントの数に制限があります。現在の実装では、同時にアクティブなブレークポイントは 1 つだけです! ↩

  2. ハードウェアウォッチポイント(ブレークポイントと同様)も、同時に 1 つだけサポートされています。 ↩

ツールをダウンロード