アカウント名:
パスワード:
たとえば、何らかの認証をするプログラムでバッファオーバーフローがあったとします。
0x00123456 : 認証関数をコールしてる所のアドレス 0x00123478 : 認証OKの場合の処理のアドレス
という形で、認証関数で次のようにバッファが取られている場合
char buf[10];
スタックは
低位← →高位 buf[10] 0x00123456
となっているはず。(かなり省略してますが) ここで、buf[10]に14byte書き込んで直後の0x00123456を0x00123478に書換えできれば認証をスルーする事ができる(事にする)
この書換えが本当にできるかどうかですが、x86というかリトルエンディアンの場合、0x00123456は0x56 0x34 0x12 0x00という順番でメモリ上にあるので、0x78 0x34 0x12 0x00 が書ければ良い訳ですが、0x00が明示的に書けなくてもASCIIZ文字列(文字列の終端が\0)である、たとえばC言語などでは、0x78 0x34 0x12まで書いたら、勝手にその後に0x00を補ってくれてしまいます。 ですから、それ程難しい話ではないような予感。
しかし、スタック内のリターン・アドレスやヒープ内の関数 ポインタを狙った純粋なオーバーフロー攻撃はすべて阻止できると思う。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ見習い
Buffer Overflow対策 (スコア:0)
> (0x00が表現できない)ASCII文字を使ったバッファオーバフローでは
> ライブラリのルーチンへジャンプが難しくなっている。
わたしゃix86のアセンブラ知らないのですが、間接ジャンプ命令だけで、回避できませんか?この対策。
Re:Buffer Overflow対策 (スコア:2, 興味深い)
あと、コードを持ち込むのではなく、コードの一部をスキップさせたりは簡単にできそうな気がします。
たとえば、何らかの認証をするプログラムでバッファオーバーフローがあったとします。
0x00123456 : 認証関数をコールしてる所のアドレス
0x00123478 : 認証OKの場合の処理のアドレス
という形で、認証関数で次のようにバッファが取られている場合
char buf[10];
スタックは
低位← →高位
buf[10] 0x00123456
となっているはず。(かなり省略してますが)
ここで、buf[10]に14byte書き込んで直後の0x00123456を0x00123478に書換えできれば認証をスルーする事ができる(事にする)
この書換えが本当にできるかどうかですが、x86というかリトルエンディアンの場合、0x00123456は0x56 0x34 0x12 0x00という順番でメモリ上にあるので、0x78 0x34 0x12 0x00 が書ければ良い訳ですが、0x00が明示的に書けなくてもASCIIZ文字列(文字列の終端が\0)である、たとえばC言語などでは、0x78 0x34 0x12まで書いたら、勝手にその後に0x00を補ってくれてしまいます。
ですから、それ程難しい話ではないような予感。
Re:Buffer Overflow対策 (スコア:0)
元ACさんの「間接ジャンプで・・・」というのとは別の話ね。