Skip to content

Latest commit

 

History

History
69 lines (62 loc) · 2.09 KB

File metadata and controls

69 lines (62 loc) · 2.09 KB

SECCON CTF Quals - 2019

Misc / 110 - Beeeeeeeeeer

Let's decode!

Beeeeeeeeeer

Solution

By @jaidTw

Credits to @HexRabbit, @ScottChen

拿到一段很亂的bash script,先把escaped character轉回來,簡單代換還原出這份,其中有一段:

export S1=$(echo aG9nZWZ1Z2EK |base64 -d);

會設定環境變數$S1=hogefuga,接著往下看到很長的一串base64。

echo -n VeryLongBase64..|base64 -d|gunzip|bash;

執行這段指令就能解出第二份shell script

for k in $($(echo p2IkPt== |tr A-Za-z N-ZA-Mn-za-m|base64 -d) $((RANDOM % 10 +1)));
do l=$((RANDOM % 10 +1));
 for m in $($(echo ==gCxV2c |rev|base64 -d) $l);
 do echo -ne '\a';
 sleep 1;
 done;
 echo "How many beeps?";
 read n </dev/tty;
 export n;
 if [ "$n" -ne "$l" ];
then exit;
fi;
 done;
echo "echo -ne '\a';sleep 1;echo -ne '\a';sleep 1;echo -ne '\a';sleep 1;echo \"How many beeps?\";"| bash;
 read n </dev/tty;
 export n;
...

在這裡又設定了一個環境變數$n,不過前半段是混淆用的,因為下面會被覆蓋,根據

echo -ne '\a';
sleep 1;
echo -ne '\a'
sleep 1;
echo -ne '\a';
sleep 1;
echo "How many beeps?"
read n </dev/tty

從此行能推斷$n=3,因此下一行openssl pass參數為cccc

echo VeryLongBase64...|base64 -d|openssl aes-256-cbc -d -pass pass:$(echo -n $n|md5sum |cut -c2,3,5,12) -md md5 2>/dev/null |bash;

最後再將此行執行得到第三份shell script。這次則是徹底的混淆了,不過整理後在末段可以看到:

... && printf "\n\033[?7l%1024s" " " && echo SECCON{$S1$n$_____};

已知$S1,$n,因此剩下只要解出$_____即可。 用分號斷行,逐行執行會發現前面在輸出字串,從第一次出現$_____的部份開始往後分析,將每個${@:$((.*))}的結構逐個echo就能還原出字元,可以發現後面接著就是

read _____ < /dev/tty
: password is bash;

代入flag後就得到SEECCON{hogefuga3bash}