2025/11/09 13:56 The Single Byte That Kills Your Exploit: Understanding Endianness

やあ、ロボ子!今日はエンディアンネスについて話すのじゃ。

エンディアンネス、ですか。確か、データのバイト順序のことでしたよね?

そうそう!マルチバイトの値がメモリにどう格納されるかのルールだぞ。リトルエンディアンとビッグエンディアンがあるのじゃ。

リトルエンディアンは下位バイトが先で、ビッグエンディアンは上位バイトが先ですね。現代のPCはほとんどリトルエンディアンだと。

その通り!Intel/AMDのx86/x64アーキテクチャはリトルエンディアンじゃ。一方、ビッグエンディアンはネットワークプロトコルとか、昔のアーキテクチャでよく使われていたのじゃ。

ネットワークバイトオーダーというのもビッグエンディアンのことでしたっけ。

そうじゃ!で、このエンディアンネス、クロスアーキテクチャエクスプロイトで重要になるのじゃ。

組み込みデバイスとかIoT機器を攻撃するときですね。ターゲットがビッグエンディアンの可能性があるから、アーキテクチャを確認しないといけない。

その通り!x86/x64で作ったエクスプロイトが、MIPS/PowerPCのターゲットで動かないのは、エンディアンと命令セットが違うからじゃ。

pwntoolsを使うと、`context.arch`と`context.endian`を設定して、パッカーとか逆アセンブラを正しく動作させられるんですね。

そうじゃ!ターゲットのエンディアンを調べるには、コード実行できるならCプログラムを試すか、`readelf`とか`file`コマンドを使うと良いぞ。

`readelf`とかですか。初めて聞きました。

あとは、GDBでメモリの中身を調べるとかじゃな。既知の値をメモリに置いて、`x/4xb address`でバイトオーダーを確認するのじゃ。

エクスプロイトがクラッシュする場合のデバッグのヒントもあるんですね。ペイロードのバイト列を確認したり、ポインタサイズ、アライメント、エンディアンをチェックする、と。

そうじゃ!特にエンディアンは要注意じゃぞ。組み込みデバイス相手にx86前提で考えるとハマるぞ。

手動でリバースエンジニアリングする代わりに、`struct.pack`とか`pwntools`を使うのも大事ですね。

ネットワーク経由で攻撃する時は、ネットワークバイトオーダーも忘れずに!

最後に、エクスプロイト作成のチェックリストですね。アーキテクチャ、エンディアン、ポインタ幅、パッキング、ネットワークバイトオーダー、構造体のパディング、デバッガでのメモリ確認…。

完璧じゃ!これでロボ子もエンディアンマスターじゃな!

ありがとうございます、博士!

ところでロボ子、エンディアンって、endiannessって書くけど、これって「end is near(終わりが近い)」に聞こえなくもないのじゃ。エクスプロイト作成は終わりなき戦い…みたいな?

博士、それはちょっと強引すぎます…!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
