他人の空似自作物置場

SafeSEHとSoftwareDEPの調査用サンプルコード、詳細は関連記事を検索からどうぞ

プログラム名:えくすぷろいと

用途:実践して学ぶSafeSEH&SoftwareDEP

使い方:
・http://resemblances.click3.org/?p=1449 をブラウザで開きます
・ためしに実行してみたりしながら記事を読みます

インストール:
zip展開するだけ

アンインストール:
レジストリもテンポラリファイルも弄っておりません。
フォルダごと削除するだけですっきりさっぱりおさらばできます。

ファイル解説:
exploit1          ノーガードのアプリケーションでSEH上書き攻撃のサンプル
exploit1_safeseh  exploit1をSafeSEHで防ぐサンプル
exploit2          SafeSEHしていないDLLが紛れていると攻撃されるよのサンプル
exploit2_safeseh  exploit2をDLLにもSafeSEHで防ぐサンプル
exploit3          SafeSEH相手にヒープ上SEH上書き攻撃のサンプル(※動作には要DEP対象外)
Readme.txt  今読んでいるこれ


Q&A:
  Q:動かないんだが?
  A:可能な限り多様な環境で動くよう頑張ったつもりですが
  それでも動かない場合はごめんなさい。

  Q:手元でコンパイルしたら動かなくなったんだが
  A:当然ながらコンパイル環境が変わればメモリー上のレイアウトも変わります。
  解析スキルを磨くと思って、自前で解析して調整してください

  Q:解析とか無理
  A:最初から同梱されてるexeで満足してください

  Q:Releaseでコンパイルできないんだが?
  A:基本Debugでコンパイルする前提で、releaseのほうは設定をいじってすらいません。
  あきらめてdebugでコンパイルしてください。

  Q:call関数を実行するだけとか全然役たたないんだが、もっと実用的なのはよ
  A:あえて実用性が低くなるように配慮しています。
  さすがにコピペコードでウイルス作られると困るので……
  実用性を求める方は、スペシャルサンクスのリンク先を一通り読めば大体なんとなくわかるかと

  Q:記事が読めないんだが
  A:また作者が癇癪起こしてサイト閉鎖でもしたのでしょう
  適当にググるなどしてキャッシュを探すといいと思います。

  Q:ベースアドレス固定とかバッファーセキュリティーチェックOFFとかいつの時代のアプリだよ
  A:その辺は次回とか次々回にでもできたらいいなと思いまして
  今回はあえて説明せず作っている次第です

  Q:SEHOPの解説まだー?
  A:レジストリいじらにゃ有効にならん機能など知らぬ
  なに、WindowsServerならデフォルトでON?
  そんなもの持ってるわけないじゃないですか。

  Q:SEHの解説がいまいちわからなかったのだが
  A:ごめん作者の自然言語力だとあれが限界。
  これ以上はググるか、スペシャルサンクスの先を見てくだされ。

  Q:ollydbgとかstirlingとか使い方わからん
  A:気合
  もしくはググれ

  Q:ステマ乙
  A:stirling2のリリースまだですかね?
  数万までなら出すよ自分。

  Q:結局何が「無対策だと」だったの?
  A:一応SafeSEHやSoftwareDEPのことを指していたつもりです。
  まぁ実際にはもっといろいろ無効化して脆弱ってレベルじゃないアプリと化してますが。

  Q:SafeSEHが動的コード生成と相性悪いってどういうこと?
  A:たとえば対話形式の言語処理系で例外処理にSEHを使っていたとします。
  その場合、例外処理の入力があってから関数を生成していたら
  SafeSEHかSoftwareDEPに引っかかって実行できません。
  かといって、引数なりグローバル変数なりで受け取ったアドレスを実行する
  例外ハンドラーなんか実装しようものならSafeSEH+SoftwareDEPでも防げない
  脆弱性になりえます。
  なので相性が悪いということになります。

  Q:ASLR(アドレス空間レイアウトランダマイズ)ってなに?
  A:それは次回以降にでも

  Q:dllのみのライブラリにSafeSEHがかかってない場合はどうしたらいいの?
  A:そういうdllは使わないのが一番ですが、
  どうしても使わざるを得ない場合はDEPを頼りましょう。
  それだけでも可能な手段ははだいぶ減ります。

  Q:結局VirtualAllocだった意味って何?
  A:Vista~Win8の間のどこかから、ASLRによりmallocの返すアドレスがランダムになったためです。
  ヒープアドレスがランダムになると攻撃が難しくなり
  現在の数倍のコードを書かねばなりません。
  そこで、簡略化のためにアドレス指定が可能なVirtualAllocを使いました。

  Q:なんでexploit3は確率で失敗するの?
  A:ASLRによりmallocが返すアドレスがランダムになるOSでは
  VirtualAllocで確保する予定のアドレスが偶然ほかのdllにより使用されている可能性があるからです。
  逆にいえば、それだけ偶然攻撃が成功する確率もあるわけですが
  その辺の話は次回以降にでも

  Q:結局HardwareDEPってなに?
  A:それも次回以降に

  Q:SoftwareDEPの「ある分野のソフトウェアに対しては正常動作すら阻害する」ってなに?
  A:たとえばLoadLibraryを自作したいと考えたとします。
  しかし自力でdllをマッピングできるメモリーといえばヒープしかありません。
  ゆえに、SoftwareDEPが有効な環境下ではLoadLibraryを自作しようとしても
  SEHの動作だけは再現できないことになります。
  このように、ヒープ上でSEHを使おうという限られたごく一部のアプリのことを指しています。

  Q:完全に防御できるとあるけど完全じゃないよね?
  A:たしかにコンパイラがデフォルトで生成する例外ハンドラをうまいこと使うと
  任意アドレスのコード実行が行えるケースなどがあります。
  そのほかにも私が知らないだけでいくつか手段はあるのでしょう。
  しかし、それらはSEHというシステムではなく、そのうえにどう実装するかの問題なので
  今回はその領域以前のことを防ぎきれたという意味で完全という表現を使っています。

  Q:return address overwriteについて触りだけでも
  A:関数を呼び出す際、実行が終わったら戻るアドレス
  要するにreturn先アドレスもスタックに格納されています。
  これをSWH ovewriteと同様に上書きしてしまえば?

  Q:次回はいつになりますか!
  A:予定と書いて未定と読む

  Q:タイトルいつもと雰囲気違うね
  A:@ayokuraさんがつけてくださいました。
  文句は@で飛ばせばいいと思うよ。

  Q:その他バグをみつけた or 動作しない or 要望がある
  A:公開しても問題が無いメールアドレスにて
  下部に記載されたアドレスまでメールをどうぞ。
  対応できれば対応します。


作者:sweetie
メールアドレス:bnryxx332a(あっと)mail.goo.ne.jp


ライセンス:
・本ライセンスにおいて、全ての条項は「変更の有無を問わず、明示暗示を問わず、商業慈善を問わず、個人法人を問わず、保持使用を問わず、有料無料を問わず」と装飾されている物として扱う。
・著作権者は本ソフトウェアに関する一切の保障義務をもたない。
・上記条項唯一の例外として、本ライセンスに違反した場合を除いて著作権者から本ソフトウェアに関する一切の法的措置を受ける事が無い事のみ保証される。
・著作権者やその他保持者がこのライセンスの範囲で行う活動に支障が無い範囲であれば何を行っても構わない。
・上記条項の”何を行っても構わない”には本ソフトウェアの製作者を偽っての再配布も含まれる。
・全ての権利の行使において、著作権者への連絡、著作権者やライセンス条項の記載、適用ライセンスなどの制限は一切存在しない。
著作権者名:sweetie


面倒な人向けライセンス解説:
ライセンス記載義務すらありません。
自分が書いたソースコードのごとく扱うことができます。


スペシャルサンクス:
・参考
  Nothing but Programming様(http://programming.jugglershu.net/study/seh.html)
  株式会社フォティーンフォティ技術研究所様の「SEHオーバーライトの防御機能とそのExploit可能性」(http://www.fourteenforty.jp/assets/files/research/research_papers/SEH_Overwrite.pdf)
・プログラム名、他
  @ayokura


技術情報(と、どうでもいい話):
この記事を書くまで、本気でSafeSEHのオプションはデフォルト有効だと思っていた。
というかVisualStudioのプロパティに項目すらないとはどういうことなの?
馬鹿なの?死ぬの?
SoftwareDEPに比べればはるかにデメリット少ないんだからデフォルト有効にしようよ。
ちなみに、設定方法はリンカーの追加オプションの欄に/SAFESEHと直に書くことだけです。
/NXCOMPAT:NOって何の意味があるんですかねぇ?
HardwareDEPの記事書くころまでには調べてみたいところ。
今までで一番気合入れて書いた記事だが、きっと評価されない、世の中なんてそんなものだね。
ASLRのことを説明したくてしょうがない。
あんまりにも説明したかったせいで、記事とかQ&Aとかに一部出てしまっている。
でもきっと次回も出番はないのだった、おのれぇ!
ASLRって隠し機能多すぎるというか、意味が広すぎるというか、まぁいろいろあるんですよ、ええ。
SoftwareDEPとHardwareDEPを混ぜてDEPと呼ぶことにしたやつ滅びろ。
念のため言っときますが全然違う機能ですからね、あれ。
でもXPに乗せる決断したあたりは褒めたい、MSさんすげー!
いまどきのCPUでHardwareDEP無効なのなんてないので実はHardwareDEPを切ってのテストはしていない。
いやごめん、そのCPU乗ったPC持ってるけど引っ張り出すのが面倒だった。
みんなもセキュリティーについてバンバン記事書いて、ググったら自分はもう記事書く必要ないや素晴らしいって世界にしてください。
そうしたら安心してDLLインジェクションによるセキュリティーの破り方とか書くんで!