【注意】このサイトに記載されていることを他人に試すことは「不正アクセス禁止法」に該当する場合があります。詳しくはこちらから

ハッカーのテクニックである、Partial Overwrite(部分上書き)入門

ペネトレーションテスト&バグバウンティ

Partial Overwrite(パーシャル オーバーライト:部分上書き)は、バッファオーバーフローなどで、ポインタや戻り番地の下位バイトだけを意図的に変更する攻撃テクニックです。
※イメージです。

Partial Overwriteとは

ポインタやアドレスの「一部(通常は下位バイト)」だけを書き換えて、指している先のアドレスをわずかに変え、プログラムの流れを乗っ取る技術です。
メモリがリトルエンディアンで並んでいることを利用し、少量の書き込みで有害なアドレスへ制御を誘導する攻撃手法です。
※リトルエンディアンとは、メモリに数値を下位バイト(最も小さい桁)から順に並べる方式です。簡単に説明すると「数字の一番右(最下位)が先にメモリに入る」と言うことです
 
 

Partial Overwriteの背景

なぜこれが可能かというと主に以下の2つになります。
 
1.リトルエンディアン表現
数値は下位バイトが小さいアドレスに格納されるため、下位バイトを上書きするとポインタの参照先が小さく(または大きく)僅かに変わる。
 
2.隣接メモリ配置の脆弱性
バッファや短い書き込み検査のミス(off-by-one、strcpyの誤用など)で、対象ポインタの下位バイトだけが上書きされやすい。
開発者は「完全なアドレスを書き換えないと効かない」と誤認しがちですが、近傍の有効なコードや関数へずらせば十分に悪用可能になります。
 
 

Partial Overwriteが引き起こす影響

攻撃者視点
・最小限の入力で実行フローを乗っ取れるため、攻撃コストが低くなる。
・GOTエントリや関数ポインタの下位バイトを変えて別関数を呼ばせる(例えば `exit` → `system` のように近いオフセットにする)場合がある。
※GOT(Global Offset Table)とは、LinuxなどのELF形式バイナリで使われる関数や変数のアドレス表です。実行時にライブラリ関数(printfなど)の実際のメモリアドレスを動的に解決するために使われます。プログラムは関数を直接呼び出すのではなく、GOTに保存されたアドレスを参照して呼び出します。
 
防御者視点
・バイナリ解析が困難になる(検出が難しい)。ログに残りにくく、典型的なシグネチャでは検出されづらい。しかし、ASLRやCanaryなどで攻撃を難しくできる。
 
 

Partial Overwriteの仕組み

イメージとして
「長い住所(例:0x7ffff7a33450)が郵便受けに書いてあり、下2桁だけを消して別の郵便受けの番地に書き換える」ようなもの。下位バイトを変えるだけで最終的に指す場所が変わる。
 
1.リトルエンディアン
アドレス `0x00401234` はメモリに `34 12 40 00` の順で保存。下位バイト(ここでは `0x34`)だけ上書きすれば、アドレスは `0x004012YY` の形に変わる。
 
2.部分書き込み
例えば `write(1, buf, n)` のような操作で意図的に 1 バイトや 2 バイトだけ上書きできると、ポインタの下位バイトのみが変化する。
 
3.成功条件
目的の「ずらし先」が有効なコード領域や別の便利な命令列を指すこと。
 
 

Partial Overwriteの対策・防御方法

実務的な防御策(優先度順):
1.セキュアコーディング
・`gets`、`strcpy`のような境界チェックのない関数は使わない。`fgets`や`snprintf`を使う。
・入力長チェックを徹底する。オフバイワンの検査ミスを防ぐ。
 
2.データレイアウトの分離
・重要な制御変数(関数ポインタ、フラグ、権限変数)はバッファと物理的に離す。
・パディングやガード用の変数(canaries)を挿入する。
 
3.コンパイラ・ビルド時の保護
・Stack Canary(`-fstack-protector`)や PIE(位置独立実行)、NXビットを有効にする。
・ASLR を有効にしてアドレス予測を難しくする。
 
4.ランタイム・検査
・静的解析ツール(clang-tidy, Coverity)や動的解析(ASan, Valgrind)でバッファ誤りを検出する。
 
5.アプリケーション設計
・権限管理(is_admin 等)は複数チェックやサーバ側での二重検査を行う。
・敏感な権限フラグは署名やチェックサムで一貫性を検査する。
 
 

ハッカーのテクニックである、Partial Overwrite(部分上書き)入門のまとめ

Partial Overwriteは「アドレスの下位バイトだけを書き換えて挙動を変える」中級テクニックで、リトルエンディアンとメモリ配置の性質を利用します。攻撃者は少ないデータで関数ポインタやGOTをずらし、別の機能を呼ばせるなどの悪用が可能です。学習では、安全なローカル環境で脆弱なCプログラムを作り、pwntoolsで送受信や挙動観察を繰り返すと理解が深まります。
一方、防御側は境界チェックの徹底、重要データの分離、スタックカナリ/ASLRの導入、静的・動的解析の活用により多層的にリスクを下げられます。