システム セキュリティ クラスの 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。