真 もわ爛漫

しゃーら、しゃーらしゃーら

バッファオーバーフロー脆弱性って何で起こせるの?

以前試したのだけどできなかったんだよね。

結論としては、リターンアドレスをmalloc()で取った領域やスタック内のアドレスにしても、そこにはexec bit立ってないからセグフォか何かで落ちるのですよ。私が今まで信じてきた「配列に任意の命令を書いておいてバッファオーバーフローでリターンアドレスをその配列の場所に飛ばす」ってのは今のCPU(少なくともPC)では都市伝説 (家電のチップだとそんな bit なかったりして困るかもしれん)。

でもバッファオーバーフロー脆弱性は起こる、そうだ。うううん。

今日聞いた限りでは「x386は可変長命令なので共有ライブラリの可変長命令の途中に飛ばしたりしたときに意味が全く変わってしまい、その結果うまくいくケース」なんてのがあるという納得のいく説明を一つ聞いた。確かにそうだねぇ。おそろしい。

でもその人(私より研究畑よりでそういうのにひじょーに詳しい)の話だと、リターンアドレスを交互にパスしまくると別の方法でやっぱり脆弱性につながる、みたいな話をしてた。なんだそれ。。。

詳しい話を知ってる人はポインタだけでも良いのでください。教えて、某の人!(謎