バッファオーバーラン
バッファオーバーラン (buffer overrun)、バッファオーバーフロー(buffer overflow)とは、コンピュータのプログラムにおいて設計者の意図しないメモリ領域の破壊が起きるバグやバグによって引き起こされた現象です。バッファオーバーランの問題を抱えたプログラムは、コンピュータセキュリティのセキュリティホールになりうるため、修正する必要があります。
読み方
- バッファオーバーラン
- ばっふぁおーばーらん
- buffer overrun
- ばっふぁおーばーらん
- バッファオーバーフロー
- ばっふぁおーばーふろー
- buffer overflow
- ばっふぁおーばーふろー
目次
概要
バッファオーバーランは、入力データのサイズを考慮しないプログラムで、バッファ領域を超えたメモリが上書きされ、誤動作を引き起こします。 上書きする対称によって、以下のように呼ばれることもあります。
- スタックバッファオーバーフロー
- ヒープオーバーフロー
バッファオーバーランによって、引き起こされる現象の例を挙げます。
- フラグの書き換え
- リターンアドレスの書き換え
C言語における例
この例は、有名な事例です。gets()関数は、推奨されない関数です。 このコードは、実際に利用するべきではありません。
#include <stdio.h> int main(int argc, char *argv[]) { char buf[256]; gets(buf); return (0); }
gets()関数は、標準入力から受け取ったデータを第一引数で指定されたバッファアドレスに対して、データを書き込みます。このとき、gets()関数は、バッファサイズを考慮しません。bufが256のサイズです。NULLターミネートを考慮するとgets()は、入力を255文字までしか受け取るべきではありません。しかしながら、gets()は、256文字を超える入力を受け取ってしまいます。256文字を超える入力は、bufのサイズを超えているため、bufを超えたスタック領域を上書きしていきます。bufを越えて上書きしていくとスタックに積まれているリターンアドレスを上書きされます。リターンアドレスを上書きされることによって、おそらく、このプログラムは、期待した動作をしなくなるでしょう。
この例では、対策として、gets()の代わりに、バッファサイズを指定できるfgets()を利用すべきです。
関連項目
CPUのセキュリティ機能
セキュアプログラミング
- バッファオーバーラン
- Return-to-libc攻撃
シェルコード
- シェルコード
- バッファオーバーフロー
- バッファオーバーラン
- 脆弱性
- ルートキット
- Return-to-libc攻撃
- shellcode2exe.py
- libemu: x86エミュレータ
C言語基礎
C言語によるハッキング
デバッグ
- IDA Pro: 逆アセンブラ
- OllyDbg
- Immunity Debugger
- WinDbg
- gdb
- cgdb: GDB CUI フロントエンド
- DDD: GDB フロントエンド
- Insight: GDB フロントエンド
- gcore
- gdbを用いたprintfデバッグ
ツイート