
LLEF(発音ɬɛf- "Hlyeff")は、低レベルのREとVRでより使用可能にするためのLLDBプラグインです。 GEFに似ていますが、LLDBの場合。
LLDBのPython APIを使用して追加のステータス出力といくつかの新しいコマンドを追加するため、セキュリティ研究者はLLDBを使用して実行中にソフトウェアを分析できます。
以下の手順は、LLDBがデフォルトで使用するようにLLEFをインストールします。
cd <repo>./install.sh~/.lldbinit )または手動インストールを選択します。LLDBは、デフォルトでX86バイナリにAT&T分解構文を使用します。インストーラーは、これをオーバーライドするオプションを提供します。
lldb-15 < optional binary to debug >LLEF固有のコマンドの設定、保存、読み込み、およびリストのさまざまなコマンド:
(lldb) llefsettings --help
list list all settings
save Save settings to config file
reload Reload settings from config file (retain session values)
reset Reload settings from config file (purge session values)
set Set LLEF settings
設定は、次のようにフォーマットされたホームディレクトリにあるファイルに保存されます.llef
[LLEF]
<llefsettings> = <value>
| 設定 | タイプ | 説明 |
|---|---|---|
| color_output | ブール | カラー端子出力を有効/無効にします |
| Register_coloring | ブール | レジスタの着色を有効/無効にします |
| show_legend | ブール | 凡例出力を有効/無効にします |
| show_registers | ブール | レジスタ出力を有効/無効にします |
| show_stack | ブール | スタック出力を有効/無効にします |
| show_code | ブール | コード出力を有効/無効にします |
| show_threads | ブール | スレッド出力を有効/無効にします |
| show_trace | ブール | トレース出力を有効/無効にします |
| force_arch | 弦 | フォースレジスタディスプレイアーキテクチャ(実験) |
| rebase_addresses | ブール | アドレスリベース出力を有効/無効にします |
| rebase_offset | int | リベースオフセットを設定します(デフォルト0x100000) |
| show_all_registers | ブール | 拡張レジスタ出力を有効/無効にします |
LLEF GUIの色を設定できます:
(lldb) llefcolorsettings --help
list list all color settings
save Save settings to config file
reload Reload settings from config file (retain session values)
reset Reload settings from config file (purge session values)
set Set LLEF color settings
サポートされた色:青、緑、黄色、赤、ピンク、シアン、グレー
| 色 |
|---|
| Register_Color |
| modified_register_color |
| code_color |
| heap_color |
| stack_color |
| string_color |
| stack_address_color |
| function_name_color |
| instruction_color |
| highlighted_instruction_color |
| line_color |
| Rebased_address_color |
| section_header_color |
| highlighted_index_color |
| index_color |
| dereferenced_value_color |
| dereferenced_register_color |
| frame_argument_name_color |
| read_memory_address_color |
メモリの内容を表示します:
(lldb) hexdump type address [--size SIZE] [--reverse]
例えば
(lldb) hexdump byte 0x7fffffffecc8 --size 0x38
0x7fffffffecc8 3d 2f 75 73 72 2f 6c 6f 63 61 6c 2f 73 62 69 6e =/usr/local/sbin
0x7fffffffecd8 3a 2f 75 73 72 2f 6c 6f 63 61 6c 2f 62 69 6e 3a :/usr/local/bin:
0x7fffffffece8 2f 75 73 72 2f 73 62 69 6e 3a 2f 75 73 72 2f 62 /usr/sbin:/usr/b
0x7fffffffecf8 69 6e 3a 2f 73 62 69 6e in:/sbin
(lldb) hexdump word 0x7fffffffecc8 --reverse
0x7fffffffece6│+001e: 0x4654
0x7fffffffece4│+001c: 0x4361
0x7fffffffece2│+001a: 0x746f
0x7fffffffece0│+0018: 0x4e23
0x7fffffffecde│+0016: 0x3f73
0x7fffffffecdc│+0014: 0x6968
0x7fffffffecda│+0012: 0x742d
0x7fffffffecd8│+0010: 0x6564
0x7fffffffecd6│+000e: 0x6f63
0x7fffffffecd4│+000c: 0x6564
0x7fffffffecd2│+000a: 0x2d75
0x7fffffffecd0│+0008: 0x6f79
0x7fffffffecce│+0006: 0x2d64
0x7fffffffeccc│+0004: 0x6964
0x7fffffffecca│+0002: 0x2d79
0x7fffffffecc8│+0000: 0x6857
llef guiをリフレッシュしてください:
(lldb) context
LLEF GUIのコンポーネントを更新します。
(lldb) context [{registers,stack,code,threads,trace,all} ...]
(lldb) pattern create 10
[+] Generating a pattern of 10 bytes (n=4)
aaaabaaaca
[+] Pattern saved in variable: $8
(lldb) pattern create 100 -n 2
[+] Generating a pattern of 100 bytes (n=2)
aabacadaea
[+] Pattern saved in variable: $9
(lldb) pattern search $rdx
[+] Found in $10 at index 45 (big endian)
(lldb) pattern search $8
[+] Found in $10 at index 0 (little endian)
(lldb) pattern search aaaabaaac
[+] Found in $8 at index 0 (little endian)
(lldb) pattern search 0x61616161626161616361
[+] Found in $8 at index 0 (little endian)
これは自動であり、現在実装されているすべての情報をブレークポイントで印刷します。
rebase_addressesで構成可能アドレスリベーシング機能を設定すると、出力に表示される各コードアドレスの検索が実行され、関連するバイナリアドレスと相対アドレスが表示されます。この相対アドレスは、 0x100000のGhidraベースアドレスをデフォルトで設定するrebase_offsetの設定で定義された値によって相殺されます。結果は、ランタイムアドレスから変換するために数学を行うことなく、簡単にコピーしてIDEの「アドレスに移動する」機能に貼り付けることができるアドレス出力です。
リベースアドレスは、ランタイムアドレスの後に括弧内に表示されます。 
LLDBには、LLEFが実行されるために必要なPythonモジュールがバンドルされています。 LLEFでLLDBを起動すると、 ModuleNotFoundErrorメッセージが発生した場合、PythonパスにLLDB Pythonモジュールを手動で追加する必要があります。
これを行うには、次のことを実行してサイトパッケージの場所を確立します。
python3 -m site --user-site次に、LLDB Pythonモジュールの場所を見つけます。これは通常、 /usr/lib/llvm-15/lib/python3.10/dist-packages llvm-15/lib/python3.10/dist-packagesなどの場所にありますが、pythonバージョンに依存します。
最後に、以下を変更して実行して、上記のサイトパッケージの場所で上記のLLDBモジュールパスを新しいファイルlldb.pthに追加します。
echo " /usr/lib/llvm-15/lib/python3.10/dist-packages " > ~ /.local/lib/python3.10/site-packages/lldb.pth各ブレークポイントでのLLEF出力のレンダリングは、一部のプラットフォームでは遅いことが観察されています。これの根本的な原因は、基礎となるGetMemoryRegions LLDB API呼び出しに由来しています。幸いなことに、これは、レジスタ値がコード、スタック、またはヒープアドレスを指すかどうかを特定するためにのみ使用されます。
レジスタの着色を無効にし、LLEFのパフォーマンスを大幅に改善するために、次のllefsettingsコマンドを使用してregister_coloring機能を無効にします。
llefsettings set register_coloring False
私たちは明らかにここの巨人の肩の上に立っています - 特にGEFのHugsyを称賛したいと思います。この模倣はお世辞だと考えてください。
LLEFについてもう少し読みたい場合は、ローンチブログ投稿にアクセスできます。