2017年02月20日

DEP回避したい(素案)

DEPを回避してコードを実行したい

DEPとは・・・コード実行可能領域でない場所でコードを実行した時にプログラムを強制終了するオプション(デフォルトはオフ)

これがあるとスタックやヒープでコードが使えなくなるので
・先日のスタック内コード
・4B0000周辺のコード
・自分の変数領域でのコード
とかもダメ

回避するにはdrab氏が既にやっているように、既存のコードでちょうどいいのを使ってLoadlibraryを呼ぶ
そして事前に用意したdllを読み込ませてコード実行する
詳しくはdrab氏のブログを見てください

で、他にもないかなーと考えたら
・VirtualProtectを呼ぶ
・VirtualAllocとかを呼ぶ

前者は指定した領域の保護種類を変更するというもの
これを使えば任意の領域をコード実行可能領域に変更できるのでDEPに引っかからなくなる

後者は新たにメモリ領域を確保するというもので、その際に好きな保護種類を選択できる

どちらの関数もメモリ上に展開はしてあるのできちんとした引数を積んだ上でそこに飛べば実行可能
ここで問題なのがきちんとした引数を積むこと

スタックに積まなきゃならん以上、スタックをある程度書き換えられなくてはならない
私が知ってる中でスタックを広範囲に書き換えられるのはdisplaytoclipboard(あとappendtoclipboard)しかない

DTCを実行してスタックを書き換えた後に関数を呼ぶ必要があるのでespを自分が任意に書き換えられる位置に変更する必要がある
既存のコードで
add esp,38
RETN
があったのでスタックバッファオバフロでRETN先を書き換えた上で38byte先のスタックを関数の引数とRETN先に書き換える
自分の環境だと38byte先は自分の出力したDTCtextの文字列があった(たぶん環境差はないと思う)のでそこの位置に当たるように文字を指定した

これで関数は呼べるようになったのだが、更に問題点があって
「引数に0がある」
こと

DTCでは文字列の終端判別にヌル文字を使っているので、textに00を入れてしまうとその後は出力されない

現状そこで詰まってて、解決するには既存のコード利用するしかないんだけど...
果たしてあるのだろうか

参考までに、VirtualProtectの引数は4種類

@保護の種類を変える領域の先頭アドレス
A何byte分変更するのか
B変えた後の保護の種類
C以前の保護の種類が入っている変数へのポインタ

まず、@とCについて
変更する領域が4B0000とかなら少なくとも4byte目に00が確実に入ってしまう
それより高位ならなんとかなるかも

次にA
ここは適当でいいと思う

最後にB
変更するのはPAGE_EXECUTE_READWRITEなので引数は0x40
確実に0が入っちゃうので困る

うまいことpushしてくれるコードがあればいいんだけど...

間違ってるかもしれないので何かあったら教えていただけると幸いです

posted by メロンピエロ at 01:19| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: