4

システム セキュリティ クラスの libc 攻撃への復帰を書いています。まず、脆弱なコード:

//vuln.c
#include <stdio.h>
#include <stdlib.h>

int loadconfig(void){
  char buf[1024];
  sprintf(buf, "%s/.config", getenv("HOME"));
  return 0;
}

int main(int argc, char **argv){
  loadconfig();
  return 0;
}

return to libc 攻撃を使用したい。プログラムのコンパイルとデバッグ:

$ gcc -g -fno-stack-protector -o vuln vuln.c
$ gdb vuln
(gdb) break loadconfig
(gdb) run
Reached breakpoint blah blah blah.
(gdb) p $ebp
$1 = (void *) 0xbfffefb0
(gdb) p system
$2 = {<text variable, no debug info>} 0x0016db20 <system>
(gdb) p exit
$3 = {<text variable, no debug info>} 0x001639e0 <exit>
(gdb) x/2000s $esp
...
0xbffff5af:    "SHELL=/bin/bash"

loadconfig攻撃を実行するには、バッファをのリターン アドレス (別名)にオーバーフローさせ、 のリターン アドレス、次に のリターン アドレス(実際のリターン アドレスが必要なため)、コマンド名 (のアドレス$esp+4) に置き換えます。プラス 6、パーツをトリムします)。これは、1024文字のがらくたの環境変数を作成し、次に、、、、およびのリトルエンディアンアドレスを作成することで可能になるはずです。systemexitsystemSHELL=/bin/bashSHELL=$HOMEsystemexit/bin/bash

ただし、私が試したすべてのコンピューターでsystemは、0x00 で始まるアドレスに読み込まれます。これにより、sprintf読み取り中の文字列が null で終了し、攻撃が停止します。メモリの他の場所に強制的libcにロードする方法はありますか、それとも攻撃を誤解していますか?

gcc参考までに、バージョン 4.6.1 およびgdbバージョン 7.3-2011.08の VirtualBox (Windows ホスト) で Ubuntu Server 11.10 仮想マシンを実行しています。編集: ASLR が無効になっており-fno-stack-protector、カナリアを削除するためにコンパイルしました。スタックから何も実行していないので、その必要はありませんexecstack

4

2 に答える 2

6

重要な libc 関数を NULL バイトを含むアドレスにマッピングする行為は、ASCII アーマーリングと呼ばれます。この保護は、最近の ubuntu ディストリビューションリンクで現在有効になっているRedHat Exec-shieldの一部です 。無効にするには、root として実行する必要があります。

sysctl -w kernel.exec-shield=0

ここで説明したように

ちなみに、ASCII アーマーをバイパスする方法に関する興味深い資料は、exploit-db にあります。

于 2011-10-16T15:42:32.647 に答える
1

少なくともあなたが言及した方法では、これが11.10では不可能であることはかなり確信しています。見てください:

https://wiki.ubuntu.com/Security/Features

詳細に、そしてあなたのアイデアでいくつかの問題を選んでください:

(1) カナリア値およびその他の理由により、esp+4 へのバッファ オーバーフローにより、セグメンテーション違反の例外が発生します。

(2) おそらく、従来は ESP (メイン) + 特定のバイト数にあった環境変数のアドレスを抽出することを意味します。ただし、最近の論理メモリアドレスでさえコンパイル後にスクランブル/ランダム化されているため、代わりに、実行ごとに $HOME 変数の異なる mememory アドレスを取得します。おそらくメインスタックの反対側のどこかにあります。

(3) 私の知る限りでは、最近の図書館攻撃からの復帰を阻止する方法は他にもあります。私はそれらにあまり詳しくありません。これが、アドレスに x00 が表示される理由です。

最近の ubunti システムでのハッキングは困難です。現在のディストリビューションを要求しないク​​ラスに対してこれを行う必要がある場合は、代わりに virtualbox に最初の ubunti ディストリビューションをインストールしてください。魔法のように、あなたがしようとすることはすべてうまくいきます。あなたが参照する「標準的なオーバーフロー攻撃」はもうありません-カナリア値などを巧みにバイパスしたとしても、nx ビットを設定するとこれが不可能になります。同様に、libc 攻撃からの復帰にどのように対処するかについては完全には確信が持てませんが、現在のディストリビューションでこれが可能であると信じてはいけません。幸運を!

于 2011-10-15T19:39:25.050 に答える