
Ubuntu日本語フォーラム

ログインしていません。
2点ほど質問させていただきます。
Ubuntu9.04を利用してバッファオーバーフローの勉強をしており、一旦UbuntuのBOF対策機能をOFFにしたいと考えております。
質問1、メモリマップを参照したところ、デフォルトでスタックからの実行パーミッションが許可されていない設定になっていたのですが、スタックからの実行を許可するにはどのように設定すればよろしいのでしょうか?
質問2、スタックからの実行禁止と、スタック領域をプログラム実行毎にランダムに変化させる機能(/proc/sys/kernel/randomize_va_space)以外にも、UbuntuにはBOF攻撃対策の設定がされていますか?
まだLinux自体始めたばかりですので、御手数ですがなるべく詳しく教えていただければと思います。よろしくお願い致します。
オフライン
質問1、メモリマップを参照したところ、デフォルトでスタックからの実行パーミッションが許可されていない設定になっていたのですが、スタックからの実行を許可するにはどのように設定すればよろしいのでしょうか?
「メモリマップの参照」というのはどのように行われたでしょうか。scanelf等で静的にELFの各バイナリの設定を確認した、という前提でしょうか。もしそうであれば、PT_GNU_STACK について調べた上で、 execstack を使ってくださいという話になります。Gentooのドキュメントになってしまいますが、http://www.gentoo.org/proj/en/hardened/gnu-stack.xml が参考になるかもしれません。
おそらく実際にbuffe overflowを起こしてexploit的なコードの基礎を学ばれたいのかなと思うのでこれで良いと思うのですが、攻撃可能な状態を仮定するためにsystem-wideに適用する等、何かもっと仮定を増やしたいでしょうか。
質問2、スタックからの実行禁止と、スタック領域をプログラム実行毎にランダムに変化させる機能(/proc/sys/kernel/randomize_va_space)以外にも、UbuntuにはBOF攻撃対策の設定がされていますか?
各バイナリを生成する際、コンパイルオプションに-fstack-protector(Stack Smash Protector有効)が付けられています。バイナリ単位でコンパイル時に有効になっているので細かく言えば「設定」ではないですが、これは回答になっているでしょうか。
また、系としての防御(mitigation)という意味ではAppArmorが導入され、「外向き」daemonではEnforceされていますが、何となく話の流れからは狭義のbuffer overflow atackへのprotectionを、という話のような気がするので、こちらは別の話かもしれません。
オフライン
回答ありがとうございます。
>メモリマップの参照について
cat /proc/self/maps
を実行して、あ、スタックに実行マーク付いてない・・・って思っただけでした。
scanelf -e directory
を実行して、回答して頂いた通り、各ファイルについて確認してみました。やはり実行許可がありませんでした。
execstack -s ファイル名
とやってscanelfで確認したところ、スタックに実行許可を与えることができました。ありがとうございます。
紹介して頂いたwebサイトが参考になりました。
>その他のBOF攻撃対策について
スタックの実行を許可しても、BOF攻撃は成功しませんでした。
戻り値の上書きが上手くいっておらず、何故か戻りアドレスに0x00000000が設定されてしまっています。もちろんオーバーフローさせた文字列には、NULLは設定しておりません。
gccでのコンパイルオプション-fno-stack-protectorも指定しています。
ubuntuまたはgcc側で自動的にNULLを設定しているのではと推測したのですが、そのような事は無いでしょうか?
実験の概略は以下の通りです。
プログラムexploitで、execl("./vuln", "vuln", buffer, NULL)関数を実行し、vulnからの戻りアドレスを上書きしてシェルコードを実行させようとしています。ここで、bufferとvulnとは
buffer[600] = NOP(\x90)スレッド 200バイト + シェルコード + 偽の戻りアドレス(NOPスレッドのどこかを指すアドレス)
/*vuln.c*/
#include<stdio.h>
#include<string.h>
main(int argc, char *argv[]){
char buffer[500];
int i;
strcpy(buffer[500],argv[1])
return 0;
}
です。
gdbで実行してみたところ、execl関数でvulnに制御が移ってから、info registerを使ってeax(戻りアドレス)を確認すると、0x0000000が設定されていました。
質問内容がUbuntuの事から大分ずれてしまい、申し訳ございません。回答可能な範囲で御教授頂ければと思います。よろしくお願い致します。
また、先の回答ありがとうございました。大変参考になりました。
オフライン
vuln.cがそもそも動かない構造に見える(strcpyの第一引数がとても変な気がする)のですが、転記ミスでしょうか。
あと、コンパイラが要らん最適化を噛ましてくれることを避けるために、puts( buffer );するのがお約束のような気もしなくもないです。
# というのをまず確認してください。
で、gcc-3.4とかでコンパイルするとアタッカー的に幸せになれるような気がしますが、いかがでしょうか。
オフライン