zlib圧縮部分を抽出・展開してファイルに保存するツール作りました
ただ、めっちゃ遅い。
CTFでzlib圧縮部分に気づかずに、解けなかった問題が過去2問あって、
これはいかんと思いました(小並感)。
zlib圧縮部分って、マジックナンバーが定まっているわけじゃなくて、目grepでもすごく判別しにくい。
しかも、fileコマンドでも、tridでも、判らないんだよね。
バイナリからzlib圧縮データを探す
http://teraapi.blogspot.jp/2012/05/zlib.html
よくある:
78 01, 78 5e, 78 9c, 78 da
稀 :
08 1d, 08 5b, 08 99, 08 d7, 18 19, 18 57, 18 95, 18 d3,
28 15, 28 53, 28 91, 28 cf, 38 11, 38 4f, 38 8d, 38 cb,
48 0d, 48 4b, 48 89, 48 c7, 58 09, 58 47, 58 85, 58 c3,
68 05, 68 43, 68 81, 68 de
極稀:
08 3c, 08 7a, 08 b8, 08 f6, 18 38, 18 76, 18 b4, 18 f2,
28 34, 28 72, 28 b0, 28 ee, 38 30, 38 6e, 38 ac, 38 ea,
48 2c, 48 6a, 48 a8, 48 e6, 58 28, 58 66, 58 a4, 58 e2,
68 24, 68 62, 68 bf, 68 fd, 78 3f, 78 7d, 78 bb, 78 f9
そこで、引数のファイルに含まれるzlib圧縮部分を抽出・展開してファイルに保存するツール作った。
CentOSで動作確認済み。Kali Linuxだとopensslでzlibのdecodeが出来なかったので、たぶん、Debian でも動かないかも。
まぁ、zpipeで代替すれば、どの環境でも行けるはず。
ちなみに、動作はめっちゃ遅い。
#!/bin/bash
# zlib_extraction.sh ver 1.3
# 引数のファイルに含まれるzlib圧縮部分を抽出・展開してファイルに保存する
# 2015.10.06 kanata
while [ "$#" -gt 0 ]
do
if [ ! -f "${1}" ]
then
echo "file open error ($1)"
exit 1
fi
FILESIZE=`ls -l ${1}|awk '{print $5}'`
ZLIBPART="${1##*/}"
ZLIBPART="${ZLIBPART%.*}"
I="0"
FORK_COUNT="0"
while [ "${I}" -lt "${FILESIZE}" ]
do
ZLIBPART_FILE="${ZLIBPART}_${I}.bin"
( cat ${1} | dd bs=1 skip=${I} | openssl zlib -d > ${ZLIBPART_FILE} 2>/dev/null ; if [ -s ${ZLIBPART_FILE} ] ; then file ${ZLIBPART_FILE} ; else rm -f ${ZLIBPART_FILE} ; fi )&
# 並列実行時のサブシェルが増大していくのを抑止
# 同時35多重までに抑止 25回に1度チェック ( 数値を弄ってチューニングできます )
if [ $(( I % 25 )) -eq "0" ] ; then FORK_COUNT=`ps -u |fgrep -c ${0}` ; fi
while [ "${FORK_COUNT}" -gt "35" ]
do
printf "[WARNING] SubProcess Exceed Limit. fork:%s offset:%s\n" ${FORK_COUNT} ${I}
FORK_COUNT=`ps -u |fgrep -c ${0}`
done
I=$(( I + 1 ))
done
shift
done
exit 0
遅かったので、処理を並列化したんだけど、その並列化を制御する処理自体がボトルネックになって、そんなに速くならなかった。微妙。
これでpdfとかswfとかから、データの抽出ができるハズ。
詳細:CTF Forensic
2016.8.3 追記
バージョンアップした。シリアル処理と並列処理を選択できるようにした。
コメント