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 追記
バージョンアップした。シリアル処理と並列処理を選択できるようにした。
Comments