zlib圧縮部分を抽出・展開してファイルに保存するツール作りました

ただ、めっちゃ遅い。
kanata3年以上前に追加

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

CTF Forensic - 引数のファイルに含まれるzlib圧縮部分を抽出・展開してファイルに保存する


コメント

クリップボードから画像を追加 (サイズの上限: 100 MB)