萌えハッカーニュースリーダー

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

出典: https://pwnforfunandprofit.substack.com/p/the-single-byte-that-kills-your-exploit
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、それはちょっと強引すぎます…!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search