セキュアソフトウェアを買って読書中なので,P147に載ってるスクリプトのLinux版を作って見ました.
誤用しやすい関数(strcpy,sprintfとか)を探すのに使うスクリプトです。
#!/bin/sh
#set -x
if [ $# != 3 ]; then
echo "Usage: " $0 " [dir] [function list] [output file]"
exit 0
fi
target_dir=$1
func_list=$2
out_file=$3
tmp=`date '+%Y%m%d%H%M%S'`
files=`find $target_dir -perm -o+x -type f`
for f in $files
do
echo "Checking $f"
file $f > $tmp
exe=`cut -f2 -d' ' $tmp`
if [ "$exe" = "ELF" ]; then
echo "------------------------------------------\n"$f >> $out_file
objdump -d $f | grep -n -f $func_list >> $out_file
echo "------------------------------------------\n\n\n" >> $out_file
fi
rm -f $tmp
done
echo "Done."
exit 0検索したい関数名を書いたファイルを用意して,
[masami@moonlight:~]% cat grep_str.txt sprintf strcpy strcat
こんな感じで使うと・・・
[masami@moonlight:~]% ./find_func.sh /usr/sbin/ grep_str.txt test.log Checking /usr/sbin/grpck Checking /usr/sbin/hibernate Checking /usr/sbin/chpasswd Checking /usr/sbin/kerneloops Checking /usr/sbin/unregister-common-lisp-source Checking /usr/sbin/dpkg-preconfigure Checking /usr/sbin/nfsstat 〜中略〜 Checking /usr/sbin/update-rc.d Checking /usr/sbin/avahi-autoipd Checking /usr/sbin/remove-default-ispell Done. [masami@moonlight:~]%
こういう感じで,ログを出力します.
------------------------------------------ /usr/sbin/grpck 302:0000000000401ce0 <strcpy@plt>: 2655: 404085: e8 56 dc ff ff callq 401ce0 <strcpy@plt> 5572: 406b50: e8 8b b1 ff ff callq 401ce0 <strcpy@plt> 5580: 406b6f: e8 6c b1 ff ff callq 401ce0 <strcpy@plt> 5592: 406b9b: e8 40 b1 ff ff callq 401ce0 <strcpy@plt> 5624: 406c1b: e8 c0 b0 ff ff callq 401ce0 <strcpy@plt> ------------------------------------------ ------------------------------------------ /usr/sbin/chpasswd ------------------------------------------ ------------------------------------------ /usr/sbin/kerneloops 222:00000000004018f8 <strcat@plt>: 1448: 402ad5: e8 1e ee ff ff callq 4018f8 <strcat@plt> 1570: 402ccd: e8 26 ec ff ff callq 4018f8 <strcat@plt> ------------------------------------------