プロジェクト

全般

プロフィール

CTF Forensic » zlib_extraction.sh

引数のファイルに含まれるzlib圧縮部分を抽出・展開してファイルに保存する - kanata, 2025/04/13 14:34

 
#!/bin/bash

# zlib_extraction.sh ver 2.0
# 引数のファイルに含まれるzlib圧縮部分を抽出・展開してファイルに保存する
# 2015.10.06 kanata

if [ ! -f "${1}" ]
then
echo "file open error ($1)"
exit 1
fi

if echo "${2}" |egrep '(BOOST|boost|Boost)' >/dev/null
then
MODE="BOOST_MODE"
else
MODE="NORMAL_MODE"
fi


FILESIZE=`ls -l ${1}|awk '{print $5}'`
ZLIBPART="${1##*/}"
ZLIBPART="${ZLIBPART%.*}"
I="0"
FORK_COUNT="0"

if [ "${MODE}" = "NORMAL_MODE" ]
then
#--------------#
# シリアル処理 #
#--------------#
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

echo -ne "checking.. "`printf "%d/%d" "${I}" "${FILESIZE}"`" \r"
I=$(( I + 1 ))
done

else
#----------#
# 並列処理 #
#----------#
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

echo -ne "checking.. "`printf "%d/%d" "${I}" "${FILESIZE}"`" \r"
I=$(( I + 1 ))
done

fi

exit 0
    (1-1/1)