ls から呼んでいる共有ライブラリ内の関数を調べる。
-bash-3.00$ sotruss ls ls -> libc.so.1:*atexit(0xff3c5bb4, 0x26000, 0x0) ls -> libc.so.1:*atexit(0x14648, 0xff1d0140, 0xee12c) ls -> libc.so.1:*setlocale(0x6, 0x14658, 0xff0b5900) ls -> libc.so.1:*textdomain(0x1465c, 0xff05bd8e, 0xff1d0200) ...
setlocale ってのを呼んでるな。これをオーバーライドするてけとーなコードをCで書いて、
-bash-3.00$ cat foo.c #include <stdlib.h> #include <stdio.h> void setlocale(void) { printf("setlocale is overrided!\n"); exit(0); }
共有ライブラリとしてコンパイルして、
-bash-3.00$ cc -o foo.so -G -K pic foo.c
ls コマンドを実行してみると、
-bash-3.00$ ls foo.*
foo.c foo.so
普通に実行される。
次に ls の中で呼ばれている setlocale をオーバーライドしてみると、
-bash-3.00$ LD_PRELOAD_32=./foo.so ls foo.* setlocale is overrided!
成功!
使った環境は以下の通り。
bash-3.00# cat /etc/release Oracle Solaris 10 9/10 s10s_u9wos_14a SPARC Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. Assembled 11 August 2010