土日の勉強ノート

AI、機械学習、最適化、Pythonなどについて、技術調査、技術書の理解した内容、ソフトウェア/ツール作成について書いていきます

書籍「バイナリファイル解析 実践ガイド」を読んだ

前回 は、「詳解セキュリティコンテスト: CTFで学ぶ脆弱性攻略の技術 Compass Booksシリーズ」という書籍を、引き続き読み進めていて、シェルコードの章を読みました。

今後も、「詳解セキュリティコンテスト」を、引き続き読み進めるつもりなのですが、今回は、「ゼロからマスター!Colab×Pythonでバイナリファイル解析実践ガイド (エンジニア入門シリーズ)」という書籍を入手したので、こちらをざっと読んで、概要だけでも、まとめておこうと思います。

目次を見ると、だいたいの内容は予想ができると思いますが、メインは、Python を使って、バイナリファイルを解析するということです。対象のバイナリファイルは、プログラム、画像ファイル、アーカイブ、文書ファイルなどです。このあたりは、フォレンジックの分野でもあるので、CTF にも役立ちそうです。

それでは、やっていきます。

参考文献

今回、題材にさせて頂いた「バイナリファイル解析 実践ガイド」です。

はじめに

「セキュリティ」の記事一覧です。良かったら参考にしてください。

セキュリティの記事一覧
・第1回:Ghidraで始めるリバースエンジニアリング(環境構築編)
・第2回:Ghidraで始めるリバースエンジニアリング(使い方編)
・第3回:VirtualBoxにParrotOS(OVA)をインストールする
・第4回:tcpdumpを理解して出力を正しく見れるようにする
・第5回:nginx(エンジンエックス)を理解する
・第6回:Python+Flask(WSGI+Werkzeug+Jinja2)を動かしてみる
・第7回:Python+FlaskのファイルをCython化してみる
・第8回:shadowファイルを理解してパスワードを解読してみる
・第9回:安全なWebアプリケーションの作り方(徳丸本)の環境構築
・第10回:Vue.jsの2.xと3.xをVue CLIを使って動かしてみる(ビルドも行う)
・第11回:Vue.jsのソースコードを確認する(ビルド後のソースも見てみる)
・第12回:徳丸本:OWASP ZAPの自動脆弱性スキャンをやってみる
・第13回:徳丸本:セッション管理を理解してセッションID漏洩で成りすましを試す
・第14回:OWASP ZAPの自動スキャン結果の分析と対策:パストラバーサル
・第15回:OWASP ZAPの自動スキャン結果の分析と対策:クロスサイトスクリプティング(XSS)
・第16回:OWASP ZAPの自動スキャン結果の分析と対策:SQLインジェクション
・第17回:OWASP ZAPの自動スキャン結果の分析と対策:オープンリダイレクト
・第18回:OWASP ZAPの自動スキャン結果の分析と対策:リスク中すべて
・第19回:CTF初心者向けのCpawCTFをやってみた
・第20回:hashcatの使い方(GPU実行時間の見積りとパスワード付きZIPファイル)
・第21回:Scapyの環境構築とネットワークプログラミング
・第22回:CpawCTF2にチャレンジします(クリア状況は随時更新します)
・第23回:K&Rのmalloc関数とfree関数を理解する
・第24回:C言語、アセンブラでシェルを起動するプログラムを作る(ARM64)
・第25回:機械語でシェルを起動するプログラムを作る(ARM64)
・第26回:入門セキュリhttps://github.com/SECCON/SECCON2017_online_CTF.gitティコンテスト(CTFを解きながら学ぶ実践技術)を読んだ
・第27回:x86-64 ELF(Linux)のアセンブラをGDBでデバッグしながら理解する(GDBコマンド、関連ツールもまとめておく)
・第28回:入門セキュリティコンテスト(CTFを解きながら学ぶ実践技術)のPwnable問題をやってみる
・第29回:実行ファイルのセキュリティ機構を調べるツール「checksec」のまとめ
・第30回:setodaNote CTF Exhibitionにチャレンジします(クリア状況は随時更新します)
・第31回:常設CTFのksnctfにチャレンジします(クリア状況は随時更新します)
・第32回:セキュリティコンテストチャレンジブックの「Part2 pwn」を読んだ
・第33回:セキュリティコンテストチャレンジブックの「付録」を読んでx86とx64のシェルコードを作った
・第34回:TryHackMeを始めてみたけどハードルが高かった話
・第35回:picoCTFを始めてみた(Beginner picoMini 2022:全13問完了)
・第36回:picoCTF 2024:Binary Exploitationの全10問をやってみた(Hardの1問は後日やります)
・第37回:picoCTF 2024:Reverse Engineeringの全7問をやってみた(Windowsプログラムの3問は後日やります)
・第38回:picoCTF 2024:General Skillsの全10問をやってみた
・第39回:picoCTF 2024:Web Exploitationの全6問をやってみた(最後の2問は解けず)
・第40回:picoCTF 2024:Forensicsの全8問をやってみた(最後の2問は解けず)
・第41回:picoCTF 2024:Cryptographyの全5問をやってみた(最後の2問は手つかず)
・第42回:picoCTF 2023:General Skillsの全6問をやってみた
・第43回:picoCTF 2023:Reverse Engineeringの全9問をやってみた
・第44回:picoCTF 2023:Binary Exploitationの全7問をやってみた(最後の1問は後日やります)
・第45回:書籍「セキュリティコンテストのためのCTF問題集」を読んだ
・第46回:書籍「詳解セキュリティコンテスト」のReversingを読んだ
・第47回:書籍「詳解セキュリティコンテスト」のPwnableのシェルコードを読んだ
・第48回:書籍「バイナリファイル解析 実践ガイド」を読んだ ← 今回

以下は「ゼロからマスター!Colab×Pythonでバイナリファイル解析実践ガイド (エンジニア入門シリーズ)」のサポートサイトです。問題ファイルをダウンロードすることが出来ます。

github.com

では、書籍の章を参考に書き進めていきます。

第1章:バイナリ解析に向けた準備運動

ここでは、Colab の紹介、Python の基本、バイナリ解析で使う Python の機能の紹介などが書かれています。ここは、パラパラと見た程度です。

少しだけメモしておきます。私は、bytes型を扱うとき、hex関数で表示させることが多いのですが、hex関数の引数に区切り文字を指定できることを初めて知りました。

>>> ee = "バイナリ解析".encode()
>>> ee
b'\xe3\x83\x90\xe3\x82\xa4\xe3\x83\x8a\xe3\x83\xaa\xe8\xa7\xa3\xe6\x9e\x90'
>>> ee.hex()
'e38390e382a4e3838ae383aae8a7a3e69e90'
>>> ee.hex(" ")
'e3 83 90 e3 82 a4 e3 83 8a e3 83 aa e8 a7 a3 e6 9e 90'
>>> ee.decode()
'バイナリ解析'

次の章に進みます。

第2章:バイナリファイルの操作

ここでは、バイナリファイルを Python で扱う方法について丁寧に説明されています。後半では、バイナリファイルをダンプするプログラムや、stringsコマンドの自作など、バイナリファイルを扱うことに慣れるような内容が続きます。

あとは、情報エントロピーを用いて、バイナリファイル全体を俯瞰して分析すること行い、その解説がされています。

次の章に進みます。

第3章:バイナリファイルの構造解析の練習:画像ファイル

ここでは、画像ファイル(BMP、PNG、JPEG形式の順)について、各バイナリフォーマットについて解説されていて、その後、Python を使って、具体的なバイナリファイルを使って実際に解析していきます。

ここまで読んできて、この書籍の方向性は、バイナリファイルを解析するツールを Python で自分で実装することで、バイナリファイル自体の理解を深めるという方法のようです。

この章の最後に、コラムとして、「なぜ便利なライブラリがあるのに自作するのか」が書かれています。その目的は、「便利なライブラリがなくても自力でなんとかする力をつけて欲しい」、「ライブラリでは気付けない情報がバイナリファイルに含まれていることを知ってほしい」ということだそうです。

うーん、これは「はじめに」とかで書いてほしいところですね(笑)。

第4章:バイナリファイルの構造解析 実践編:コンテナファイル(アーカイブ、文書ファイル)

ここでは、ZIPファイル、PDFファイルについて、第3章と同様に、ファイルフォーマットの解説を通じて、各ファイルについて深掘りして説明がされています。特に、PDFファイルは、いろいろな拡張がされたり、何か別のものが埋め込まれたりとm、CTF でも出題頻度が高いと思うので、基本が身に着くと思います。

次の章に進みます。

第5章:応用編1 バイナリファイル解析の道具箱(Binary Refinery)

ここでは、Binary Refinery という、バイナリファイルを解析するための Pythonベースのツールについて、90ページぐらいの分量で説明がされています。

今回は細かく読めませんでしたが、バイナリファイルの解析を専門的に行う場合に使われているツールかな、という感じでした。このツールを使われている方にとっては、貴重な書籍なんだと思います。

第6章:バイナリファイルの構造解析 実践編:実行ファイル

ここでは ELF形式のプログラムファイルを題材として、ELFファイルのフォーマットについての解説や、アセンブラコードの読み方の解説が行われています。

35ページぐらいの分量です。前章のボリュームと比較すると少ないですね。そういう方向性の書籍だということです。

第7章:応用編2 バイナリファイル解析の実践 CTF

ここでは、CTF のリバースエンジニアリングの問題を題材として、Python で逆アセンブラを解析していく方法について説明されています。

40ページぐらいの分量です。また、ツールは、Python と親和性が高いことが理由なのか、radare2 が使われています。IDA や、Ghidra を使われている方にとっては注意ですね。

後半では、Python のバイトコードの解析について説明があります。解説の分量は少なめですが、全く知らないと、CTF の問題を解くのは難しいので、一度は読む価値があると思います。

Python のバイトコードの CTF の問題としては、以前、以下の記事で、picoCTF 2024 の Reverse Engineering の weirdSnake という問題で扱ったことがあります。

daisuke20240310.hatenablog.com

第8章:応用編3 機械学習を用いたバイナリ解析 ~マルウェアの種類推定を例に~

ここでは、マルウェア解析を題材として、機械学習によって、バイナリファイルの解析を効率化する方法について解説されています。

具体的には、逆アセンブラして、アセンブラ命令を特徴量として、word2vec を用いて、学習を行います。学習に使われるデータセットは、6つのマルウェアカテゴリが含まれており、マルウェアではないものは入っていません。つまり、マルウェアかどうかを判定するのではなく、マルウェアと分かっている前提で、どの種類のマルウェアなのかを判定する機械学習ということです。マルウェアではないデータも含めて判定する方法については、環境構築の方法までが解説されています。

最近だと、LLM を使っていることが多そうですが、ここでは、マルウェア解析に機械学習を使う場合の基本的な技術や手法を学ぶことが出来る(雰囲気を知ることが出来る)と思います。

おわりに

今回は、「ゼロからマスター!Colab×Pythonでバイナリファイル解析実践ガイド (エンジニア入門シリーズ)」をざっくり読みました。これからバイナリファイルの解析を本格的にやってみたい方が、最初に読む書籍としていいと思います。ただ、Python を使って解析することが前提となっていて、ちょっと偏ってるような気はしました。

また、Colab を使うことが前提になっていることも気になりました。Colab は Python しか使わない人にとってはいいツールだと思いますが、実際は、いろんなツールと組み合わせて取り組むことが多いので、Linux と Colab のやり取りが面倒だと感じました。

最後になりましたが、エンジニアグループのランキングに参加中です。

気楽にポチッとよろしくお願いいたします🙇

今回は以上です!

最後までお読みいただき、ありがとうございました。