プログラミング言語Rust(以下、Rust)は、Mozillaにより開発されている言語であり、CやC++に代わる言語として注目されている。Rustはメモリ安全性と高速性に優れているため、近年採用が増加している。
一方で、Rustがプログラミング言語として普及するにつれ、SysJokerの亜種やBlackCatランサムウェアなど、Rustを利用して開発されたマルウェア(以下、Rustマルウェア)が増加する傾向にある。
しかし、Rustマルウェアに対するリバースエンジニアリングの手法や知見は、他言語で作成されたマルウェアに比べるとまだ十分に蓄積されていないのが現状である。Rustなど新しい言語で作成されたバイナリは、従来のC言語などで作成されたバイナリと比較して異なる構造を持つことが多く、従来の分析手法とは異なるアプローチや知識が求められる。
本レポートでは、Rustで作成されたバイナリ(以下、Rustバイナリ)のリバースエンジニアリングを行う上で必要となる知見について調査を実施し、その結果をまとめた。
本レポートは、以下のような技術者を想定読者としている。
- マルウェアアナリスト
- Rustバイナリのリバースエンジニアリングをする方
- Rustの内部構造の理解を深めたい方
本調査で使用したrustcおよびcargoのバージョンを示す。また、コンパイルはWindows上でMSVC環境を使用した。
- cargo: 1.82.0
- rustc: 1.82.0
バイナリのディスアセンブルにはIDA Proを利用した。本調査で使用したIDA Proのバージョンを以下に示す。
- IDA Pro v8.3.230608
本レポートでは、以下の項目について調査した結果をまとめている。
No. | 項目 | 概要 |
---|---|---|
1 | CargoのProfile設定の変更に伴うバイナリの差分 | 公開情報から得られるcargoを用いたバイナリサイズ削減手法が、どの程度サイズ削減可能なのか、残留する情報はどのようなものか調査 |
2 | バイナリサイズ削減 | 公開情報から得られるrustcを用いたバイナリサイズ削減手法が、どの程度サイズ削減可能なのか、残留する情報はどのようなものか調査 |
3 | Rustバイナリの識別 | Rustバイナリか否かを識別する方法の調査 |
4 | Exception Directory | Exception Directoryの構造から得られる情報の調査 |
5 | TLS Directory | TLS Directoryの構造とTLS Callbackの内容から得られる情報の調査 |
6 | main関数の特定と初期化処理 | ユーザー定義のmain関数の特定方法 |
7 | 文字列 | 文字列の取り扱い方法 |
8 | 関数名のマングリング | マングリングされた関数名の構造およびデマングリング方法 |
9 | クロージャ | クロージャの動作や使用されるメモリレイアウト |
10 | 列挙型 | Rustにおける列挙型の動作がアセンブリにてどのように実装されるかの調査 |
11 | match文 | Rustにおけるmatch文の動作がアセンブリにてどのように実装されるかの調査 |
12 | Panic文 | パニック時の挙動であるunwindとabortのアセンブリの差分 |
13 | イテレータ | イテレータやnext関数を使用したコードがアセンブリにてどのように実装されるかの調査 |
14 | トレイト | トレイトを実装した関数呼び出しと通常の関数呼び出しとの差異 |
15 | 代表的なトレイトの識別 | #[derive]属性で用いられるトレイトのアセンブリ上で識別方法 |
16 | 動的ディスパッチ参照 | アセンブリの特徴および動的/静的ディスパッチを用いた呼び出しの差異 |
17 | コレクション | 使用されるメモリレイアウト |
18 | 同一ジェネリクスから生成された関数の識別 | 生成元となった関数を特定方法の調査 |
19 | スマートポインタ | スマートポインタの特徴やメモリレイアウト |
20 | インラインアセンブリ | 特徴的なコードパターン |
21 | link属性 | ライブラリのリンク方法の差異 |
22 | repr属性 | 指定可能なオプションにおいてメモリレイアウトがどのように変化するかの調査 |
23 | 標準・サードパーティライブラリの判別方法 | 静的リンクされた標準ライブラリ・サードパーティライブラリ関数の識別の方法 |
追加調査の要望や本レポートの間違い等がありましたら、IssueまたはPull Requestからご連絡ください。