libsafeを使ってみる
libsafeはCの標準関数のうち,よくバッファオーバーフローを起こすものを差し替えてバッファサイズをチェックする処理をしてくれるらしいので試してみた.
libsafeはベル研がLinux向けに開発した,バッファオーバフロー対策用のライブラリらしい.
詳細はこの辺に書いてあるが,とにかくCの標準ライブラリがバッファのオーバーフローチェックをしてないからダメなんじゃないか,だったらそういうライブラリを作って差し替えようとか,そういう感じらしい.
では,libsafeをインストールしてみる.
まず,この辺からソースをダウンロードする.
あとは,展開してmake.
# tar zxvf libsafe-2.0-16.tgz # cd libsafe-2.0-16 # make install cd src; make install make[1]: Entering directory `/home/matsu/usr/local/src/libsafe-2.0-16/src' gcc -c -o util.o -O2 -Wall -fPIC -DLIBSAFE_VERSION=\"2.0.16\" util.c util.c: In function '_libsafe_warn': util.c:1428: warning: 'maps' may be used uninitialized in this function gcc -c -o intercept.o -O2 -Wall -fPIC -DLIBSAFE_VERSION=\"2.0.16\" intercept.c gcc -o libsafe.so.2.0.16 -shared -Wl,-soname,libsafe.so.2 -ldl util.o intercept.o ln -sf libsafe.so.2.0.16 libsafe.so install libsafe.so.2.0.16 /lib /sbin/ldconfig Type y for installing libsafe system wide?[default n] install ../doc/libsafe.8 /usr/share/man/man8 make[1]: Leaving directory `/home/matsu/usr/local/src/libsafe-2.0-16/src'
適当にlibsafeがチェックする関数を呼び出すサンプルを作成してみる.
コンパイルしてlddすると以下のようになる.
$ ldd sample
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/tls/libc.so.6 (0x4001d000)
/lib/ld-linux.so.2 (0x40000000)
ここで,LD_PRELOADにlibsafeを設定してみる.
export LD_PRELOAD=libsafe.so.2もう一度lddすると,libsafeがロードされるようになる.
$ ldd sample
libsafe.so.2 => /lib/libsafe.so.2 (0x4001d000)
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/tls/libc.so.6 (0x40022000)
libdl.so.2 => /lib/tls/libdl.so.2 (0x40154000)
/lib/ld-linux.so.2 (0x40000000)

