My Daily Programming Life...

Showing posts with label SEH. Show all posts
Showing posts with label SEH. Show all posts

情報の伝わり方

CanSecWest2010で話したことが少しだけ下の記事で参照されている。

問題は、ちょっと書いていることが、僕の言ったことと変わってしまっているということ。
"SEH OverwriteでASLRとDEPやその他のメモリプロテクションがバイパスできる"みたいなことを言ったように書かれているが、僕が言ったことの中にはASLRは含まれていない。
実際に、この発表の結論は、ASLRがこれらのバイパスを防ぐために重要な役割をしているということだった。スライドを一枚使ってきちんと説明したのに・・・。
おそらく、会場にいた技術的なバックグラウンドがある人たちにはきちんと伝わったはずだと思う。実際にその後のディスカッションでも何も認識に違いはなかった。

この前も、一部のニュースでASLRとDEP回避のゼロデイが出たみたいなのがあって、実際にはASLR回避は含まれていなかった。

話はだんだん大きくなってしまうのかもしれない・・・。

ところで、ASLRは単純に回避するのは難しい。
SEH Overwriteの場合、SEHOPと組み合わせると、かなり効果的だる事は間違いない。
ただ、ここの記事でも書かれているように、難しいことと不可能なことは違う。
実際にはDEP+ASLRの回避方法自体は例がある。まあただこれもSEHOPを組み合わせると難しくなる。
ASLR+SEHOP回避も、少しはExploit確率をあげるような方法はあるかもしれない。そのあたりを今度は調べてみようか。

SafeSEHとSoftware DEP

SEH関連の情報をひたすらに収集しているのだけれど、いまいちSafeSEHとSoftware DEPとの関係性が分からない。
あるところでは全く同じ物だと書いてあったり、そうでないところもあったり。全く関係がないわけではないことは確かなのだけど。
SafeSEHオプションがなくてもSoftware DEPの一部は機能する気がするし、一方でSoftware DEPを実行属性なしメモリを例外ハンドラとして呼ばない機能とすれば、SafeSEHオプションだけでも意味のある物になる(登録されている例外ハンドラしか呼ばないという機能になるから)。

いまのところ、僕のイメージは、別々の物だけれどどちらもSEHを攻撃から保護してくれる機能という感じ。
でもなんか違うのかも。どこからどこまでがSafeSEHで、どこからどこまでがSoftware DEPなのかはっきりしてほしいと思うのだけれど・・・。

まあ、もうすぐ整理して書かなくてはいけないので、これから必死になっていろいろ読んで理解するしかない。

SEH and SEHOP 現在の疑問 とりあえず解決?

前の投稿からちょっとしか時間がたってないけど、もう一度読み返して解決したかなぁといった感じ。
uninformedの方のPDFには、スタック上の_EXCEPTION_REGISTRATION_RECORDのnextを0xffffffffに攻撃者が書き換えたらどうなるか、ということを考察してあって、その場合はpop,pop,ret命令に飛ばすことで、このnextのコードを実行するという利点が生かせなくなるため、そうする意味がなくなると書いてある。これが僕の考えていたことであって、そうなんだったら、わざわざ終端用フレームを入れる必要がない。でも、さらに付け加えて、それでも何らかのコードを任意に実行されることは確かなので、念のためにランダムな終端フレームを入れてチェックするように下ほうがいい、と言っている。

つまりは念のためにそうしているという感じなのかもしれない。まあ、pop,pop,retを利用できないとなれば、基本的にはスタックオーバーフローならリターンアドレス書き換えの方が素直な方法だし、SEH Overwritingの利点がなくなっちゃうし。

とりあえず、こんな感じで解決と言うことにしておきます。

SEH and SEHOP 現在の疑問

SEHについて今いろいろ調べている。そのうちまとめてこのサイトにも載せる予定。
最初は単純にSEHの仕組みを知りたかったのだけれど、だんだんと深くなってしまい、
まずは下のを読んで
http://uninformed.org/?v=5&a=2&t=pdf
それから
http://blogs.technet.com/srd/archive/2009/02/02/preventing-the-exploitation-of-seh-overwrites-with-sehop.aspx
を読んだ。
他にもいろいろ読んだのだけれど、とりあえずこの二つで今のところ疑問なのは、
なぜスレッドの開始時に終端例外フレームを挿入しておかないといけないのかということ。例外フレーム(_EXCEPTION_REGISTRATION_RECORD)のnextポインタが0xffffffffに突き当たればそれでOKなんじゃないのか?と思った。でもきっと違うんだろう。入れておかないといけないんだろうなぁ。でもなんでだか今のところよく分からない。

誰か分かる人教えてください。
feedSubscribe to my feed