NScripterの旧バージョンに存在した脆弱性。細工されたセーブデータを読み込むと任意のコードを実行される可能性がある。$201,"ふが"end例えばこのようなスクリプトで、数値変数%200と%201に1と2を、文字列変数$200と$201にあああといいいを書き込むと、gloval.savは次のようになる。単なるスタックバッファオーバーフローで、この文字列の長さを1100バイトくらいにすると、gloval.savの読み込み時にプログラムが落ちる。攻撃の方法についてスタックの値を0x00以外の任意の値にすることができるので、簡単に攻撃できるかと思いきや、なかなか難しい。リターンアドレスの上書きが思いつくが、NScripterの場合は、ExitProcessによってプログラムを終了していて、この脆弱性で破壊できる位置までスタックが戻ることがない。リターンアドレスの上書き以外の攻撃手段として、SEHオーバーライトがある。要はSEHハンドラをpop;pop;ret;のアドレスに書き換えれば良い。NScripter.exe中にもpop;pop;ret;が存在するけれど、NScripter.exeの存在するアドレスには先頭バイトが0x00。これについては、変数が何個もあり、スタックバッファーオーバーフローを何かも起こせるので、2回に分けて書き込めば良い。SEHオーバーライドを発動させるためには何らかの例外を起こす必要がある。NScripterの場合は、(たぶん)大量のデータを書き込むしかない。この方法だと、大量のデータを書き込んだ時点でせっかくスタックに書き込んだ0x00が潰れてしまう。そもそも、NScripter.exeはSafeSEHが有効になっているので、例外ハンドラ以外の場所には飛べない。いうことで、ヒープにnop;nop;...;nop;pop;pop;ret;というデータを用意して、そこに飛ばすしかない。NScripterの場合はgloval.savから読み込まれる変数がデフォルトでは(4096-200)個あるので、こういう文字列を3895個読み込ませ、最後にSEHオーバーライドで、0x03010101とか0x04010101あたりに飛ばすと運が良いとシェルコードが動く。これが通用するのはWindows7まで。Windows7ではヒープは小さいアドレスから順に確保されていくが、Windows8ではランダム化されているので当たる確率が大きく下がる。Windows8ではSEHOPが有効になっていて、SEHチェインが壊れていると、SEHの処理が実行されない。exe単位でレジストリで無効にすることはできる。セキュリティも強化されているのでWindowsはなるべく新しいものを使おう。そもそも脆弱性なのだろうか?たいていのゲームエンジンにはOSコマンドを実行する機能があるだろうから、シナリオスクリプトを上書きして任意のコードが実行できるのは当たり前で、脆弱性にはならない気がする。考えると、セーブデータを上書きして任意のコードが実行できるというのは脆弱性なのかどうか微妙なラインだと思う。ネットで拾ったセーブデータを読み込ませるとか、作者の想定していないような使い方をするときは、重要なマシンでは実行しないなどユーザーが気をつけるべきなのかもしれない。Exploit最後にSEHオーバーライドする文字列の末尾にさらに文字列をつけて、例外を起こしている。upLoginユーザーは見つかりませんでした。