好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

SECCON 2019 Online CTF のwrite-up

去年に続き、今年もSECCON 2019 Online CTFに参加しました!
前から夫の出張と丸かぶりなのがわかっていたので問題収集で終わろうと思っていたのですが、短い時間でも思いの外楽しめました!数少ない&低得点問題のみですが、折角writeup書きながらやってたので記念に。

f:id:kusuwada:20191020204311p:plain

初日の15:00~17:00, 3:00~3:30 の参加でした。

成績は簡単な問題3問といて156pt 304位。あと一問解けてれば結構「やったぜ」感あったかもなぁ。

  • [crypto] coffee_break
  • [misc] Beeeeeeeeeer

Beeeeeeeeeerのほうは時間内には解けませんでしたが、writeupが殆ど書き終わってたのでそのまま掲載。

[crypto] coffee_break

問題

The program "encrypt.py" gets one string argument and outputs ciphertext.

Example:

$ python encrypt.py "test_text"
gYYpbhlXwuM59PtV1qctnQ==
The following text is ciphertext with "encrypt.py".

FyRyZNBO2MG6ncd3hEkC/yeYKUseI/CxYoZiIeV2fe/Jmtwx+WbWmU1gtMX9m905

Please download "encrypt.py" from the following url.

encrypt.pyが配布されます。

import sys
from Crypto.Cipher import AES
import base64


def encrypt(key, text):
    s = ''
    for i in range(len(text)):
        s += chr((((ord(text[i]) - 0x20) + (ord(key[i % len(key)]) - 0x20)) % (0x7e - 0x20 + 1)) + 0x20)
    return s


key1 = "SECCON"
key2 = "seccon2019"
text = sys.argv[1]

enc1 = encrypt(key1, text)
cipher = AES.new(key2 + chr(0x00) * (16 - (len(key2) % 16)), AES.MODE_ECB)
p = 16 - (len(enc1) % 16)
enc2 = cipher.encrypt(enc1 + chr(p) * p)
print(base64.b64encode(enc2).decode('ascii'))

まず、このコードを問題文の通りテストで動かしてみたのですが、エラーが発生。TypeError: Object type <class 'str'> cannot be passed to C codeとのこと。調べてみると、どうやらPyCryptoではなくPyCryptodomeの方を参照しているのが原因とのこと。ただ、現在 PyCrypto は非推奨であり、PyCryptodome への移行が推奨されているので、PyCryptoに向けるのではなくて渡す関数の型を変換する方向でコードを修正しました。

import sys
from Crypto.Cipher import AES
import base64


def encrypt(key, text):
    s = ''
    for i in range(len(text)):
        s += chr((((ord(text[i]) - 0x20) + (ord(key[i % len(key)]) - 0x20)) % (0x7e - 0x20 + 1)) + 0x20)
    return s


key1 = "SECCON"
key2 = "seccon2019"
text = sys.argv[1]

enc1 = encrypt(key1, text)
cipher = AES.new((key2 + chr(0x00) * (16 - (len(key2) % 16))).encode('utf-8'), AES.MODE_ECB)
p = 16 - (len(enc1) % 16)
enc2 = cipher.encrypt((enc1 + chr(p) * p).encode('utf-8'))
print(base64.b64encode(enc2).decode('ascii'))

これで問題文の通り動作しました。

$ python encrypt.py test_text
gYYpbhlXwuM59PtV1qctnQ==

あとは、このコードでエンコードされた文字列FyRyZNBO2MG6ncd3hEkC/yeYKUseI/CxYoZiIeV2fe/Jmtwx+WbWmU1gtMX9m905をdecodeすればOK。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import sys
from Crypto.Cipher import AES
import base64


def encrypt(key, text):
    s = ''
    for i in range(len(text)):
        s += chr((((ord(text[i]) - 0x20) + (ord(key[i % len(key)]) - 0x20)) % (0x7e - 0x20 + 1)) + 0x20)
    return s

def decrypt(key, text):
    s1 = ''
    s2 = ''
    s3 = ''
    for i in range(len(text)):
        num = ord(text[i]) - (ord(key[i % len(key)]) - 0x20)
        while num < 0:
            num += 95 # 0x7e - 0x20 + 1
        s1 += chr(num)
        s2 += chr(num + 95)
        s3 += chr(num + (95*2))
    return s1, s2, s3

key1 = "SECCON"
key2 = "seccon2019"
encrypted = "FyRyZNBO2MG6ncd3hEkC/yeYKUseI/CxYoZiIeV2fe/Jmtwx+WbWmU1gtMX9m905"

cipher = AES.new((key2 + chr(0x00) * (16 - (len(key2) % 16))).encode('utf-8'), AES.MODE_ECB)

enc2 = base64.b64decode(encrypted)
enc1 = cipher.decrypt(enc2)
# print(enc1) # b"'jff~|Ox9'34G9#g52F?489>B%|)173~)%8.'jff~|Q\x05\x05\x05\x05\x05"
enc1 = enc1[:-5] # paddingは b'\x05' * 5 なので除外
flag = decrypt(key1, enc1.decode('utf-8'))
for f in flag:
    print(f)

% 95の部分が完全にもとに戻せなかったので、3周分くらい出力してみてflagになりそうな文字を集めてみました。

実行結果

$ python solve.py 
SECCONSDY   Y   SECCON
²¤¢¢®­{²uccess_£ecryption_¸eah_¸eah_²¤¢¢®­}
đăāāčČÚđÔÂÂÄÒÒ¾ĂÄÂÑØÏÓÈÎ;ėÄÀǾėÄÀǾđăāāčČÜ

これをいじって

flag: SECCON{Success_Decryption_Yeah_Yeah_SECCON}

[Misc] Beeeeeeeeeer

Let's decode!

  • Beeeeeeeeeer

Beeeeeeeeeerというファイルが渡されます。fileコマンドで調べてみます。

$ file Beeeeeeeeeer 
Beeeeeeeeeer: ASCII text, with very long lines, with no line terminators

なるほど?中身を見てみます。

echo -e "\033#8";sleep 1;C=$(tput cols);L=$(tput lines);for ID in $(seq $(($L*$C
*6)));do x=$(($RANDOM%$C));y=$(($RANDOM%$L));printf "\033[${y};${x}f ";done;for 
ID in $(seq $(($L*$C*6)));do x=$(($RANDOM%$C));y=$(($RANDOM%$L));printf "\033[${
y};${x}fF";done;clear;echo TGV0J3MgZGVjb3JkaW5nISjiiafiiIDiiaYqKQo=|base64 -d;re
ad;$'\164\162\141\160' '' $'\61' $'\62' $'\63' $'\x31\x35' $'\x31\x38' $'\u0031\
u0039' $(echo MjAK |base64 -d);echo $-|grep x && exit;$(echo =btB |rev|tr A-Za-z
 N-ZA-Mn-za-m|base64 -d)|$(echo =bNpyW3M |rev|tr A-Za-z N-ZA-Mn-za-m|base64 -d) 
$(echo XRKY |rev|tr A-Za-z N-ZA-Mn-za-m|base64 -d) $(echo =ogO |rev|base64 -d)&&
exit;if [ -z "$1" ];then  ID=$'\x6e\x61\x6e\x64\x6f\x6b\x75';else  ID="$1";fi;if
whoami | grep -e root -e user -e adm -e nobody -e test -e "$ID" >/dev/null;then 
:;else exit; fi;for i in $($'\x73\x65\x71' $((RANDOM % 10)));do  $($'\x65\x63\x6
8\x6f' c2xlZXAK | $'\x62\x61\x73\x65\x36\x34' -d) $((RANDOM % 300));done;$'\145\143\150\157' $-|$(echo =oAclJ3Z |rev|base64 -d) $(echo =oAe |rev|base64 -
d) && $($'\x65\x63\x68\x6f' ZXhpdAo= | $'\x62\x61\x73\x65\x36\x34' $'\x2d\x64' )
;$(echo =btB |rev|tr A-Za-z N-ZA-Mn-za-m|base64 -d)|$(echo M3WypNb= |tr A-Za-z N
-ZA-Mn-za-m|base64 -d) $(echo YKRX |tr A-Za-z N-ZA-Mn-za-m|base64 -d) $(echo Btb
...

shellコマンドが羅列してある感じがする…!
とりあえずterminalに貼り付けてみると、チカチカしたアニメーションが実行されて最後にこの表示。

Let's decording!(≧∀≦*)

このまま固まって終わる。

仕方ないので。一つずつコマンドを斜め読みしながら解読していくことに。Base64 encodeされている部分が長いので、そこは一気に変換できる。
まずは ;;\n に置換したりと整形作業から入り、

echo TGV0J3MgZGVjb3JkaW5nISjiiafiiIDiiaYqKQo=|base64 -d;

このような記述はbase64 decodeするだけなので、このまま実行分を貼り付けてdecodeしてもらう。この行は Let's decording!(≧∀≦*)になる。

$'\164\162\141\160' '' $'\61' $'\62' $'\63' $'\x31\x35' $'\x31\x38' $'\u0031\u0039' $(echo MjAK |base64 -d);

このような記述は、8進数→ascii変換, 10進数→ascii変換, 16進数, unicodeからの変換を噛まして、trap 1 2 3 15 18 19 20 となります。
あまりflagに繋がらないようなコマンドもあるので、ザクっと飛ばしたり、おなじ変換が2~6箇所くらいまとまっているので一括変換したりしましたが、基本的に心のこもった手作業で変換しました。

ちょっと見やすくなったもの

echo -e "\033#8";
sleep 1;
C=$(tput cols);
L=$(tput lines);
for ID in $(seq $(($L*$C*6)));
do x=$(($RANDOM%$C));
y=$(($RANDOM%$L));
printf "\033[${y};
${x}f ";
done;
for ID in $(seq $(($L*$C*6)));
do x=$(($RANDOM%$C));
y=$(($RANDOM%$L));
printf "\033[${y};
${x}fF";
done;
clear;
echo Let's decording!(≧∀≦*)
read;
trap 1 2 3 15 18 19 20
echo $-|grep x && exit;
:|grep -q :&&exit;
if [ -z "$1" ];
then  ID=nandoku;
else  ID="$1";
fi;
if whoami | grep -e root -e user -e adm -e nobody -e test -e "$ID" >/dev/null;
then :;
else exit;
 fi;
for i in seq(1~10の間でランダム);
    do sleep $((RANDOM % 300));
    done;
echo -| grep x && exit;
:|grep -q :&&exit;;
export s1=hogefuga; # ここ大事

# この次の長い base64 encode された部分は、別途 base64 decodeして別ファイル unziped に。
# $ echo {base64encode text}|base64 -d|gunzip > unziped

ここまで読んだところで、先程の unzipedの中身が気になったので見てみます。

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 $($'\u0065\u0063\u0068\u006f' ZWNobwo= | $'\u0062\u0061\u0073\u0065\u0036\u0034' $'\u002d\u0064' ) -ne '\a'; $'\u0073\u006c\u0065\u0065\u0070' $(echo =oQM |rev|base64 -d); done; $($'\x65\x63\x68\x6f' ZWNobwo= | $'\x62\x61\x73\x65\x36\x34' -d) "How many beeps?"; $'\162\145\141\144' n </dev/tty; export n; if [ "$n" -ne "$l" ];then $'\x65\x78\x69\x74';fi; done;echo ZWNobyAtbmUgJ1xhJztzbGVlcCAxO2VjaG8gLW5lICdcYSc7c2xlZXAgMTtlY2hvIC1uZSAnXGEnO3NsZWVwIDE7ZWNobyAiSG93IG1hbnkgYmVlcHM/IjsK|$($'\x65\x63\x68\x6f' YmFzZTY0Cg== | $'\x62\x61\x73\x65\x36\x34' $'\x2d\x64' ) $(echo XDJY |rev|tr A-Za-z N-ZA-Mn-za-m|base64 -d)|$(echo =bNnmSzL |rev|tr A-Za-z N-ZA-Mn-za-m|base64 -d); $'\162\145\141\144'  $'\u006e' </dev/tty; $'\u0065\u0078\u0070\u006f\u0072\u0074'  $'\156';echo {base64 encodeされた文字列。省略。}|base64 -d|openssl aes-256-cbc -d -pass pass:$(echo -n $n|md5sum |cut -c2,3,5,12) -md md5 2>/dev/null |bash;

わー。これも難読化されています。同様に読み解いていきます。

for k in seq{1~10の間,ランダム};
    do l={1~10の間,ランダム};
        for m in seq 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 -ne '\a';
    sleep 1;
    echo -ne '\a';
    sleep 1;
    echo -ne '\a';
    sleep 1;
    echo "How many beeps?";

ちょっと最後の方適当。意味のない処理が続きます。ここで、この次にある長いbase64 encodeされた部分をbase64 decodeして他ファイルに書き出します。

$ echo {base64 encodeされたテキスト} | base64 -d > openssl_input

これを openssl で処理しているようなので、同様にしてあげます。

$ cat openssl_input | openssl aes-256-cbc -d -pass pass:??? -md md5

おや、passwordがいる。echo -n $n|md5sum |cut -c2,3,5,12 とあります。nは上記より export されていて、lと同じはずなので 1~10のいずれかの数字です。RANDOMなのでわからないので、全部試してみたところ、n=3のとき(passはcccc)でうまくいきました。

$ echo -n 3|md5sum |cut -c2,3,5,12
cccc
$ cat openssl_input | openssl aes-256-cbc -d -pass pass:cccc -md md5 > plain

できたplainを見てみます。

__=$(. 2>&1);__=${__##*.};__=$(. 2>&1);__=${__##*.};${__:$(($[($[$$/$$]<<$[$$/$$]<<$[$$/$$]<<$[$$/$$])+$[$$/$$]]+$[($[$$/$$]<<$[$$/$$]<<$[$$/$$]<<$[$$/$$])+$[$$/$$]]+$[$$/$$])):$((___=___^___||++___))}${__:$[$[$$/$$]<<$[$$/$$]<<$[$$/$$]]:$((___=___^___||++___))}${__:$(($[($[$$/$$]<<$[$$/$$]<<$[$$/$$]<<$[$$/$$])+$[$$/$$]]+$[($[$$/$$]<<$[$$/$$]<<$[$$/$$]<<$[$$/$$])+$[$$/$$]])):$((___=___^___||++___))} -- {z..A};${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))} "${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=____^____||++____))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))-$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))} ${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))-$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))} ${@:$((____=____^____||++____))$((____=____^____||++____)):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}";${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))} _____</${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}/${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))-$((____=____^____||++____)))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))-$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))};: ${@:$((____=____^____||++____))$((____=____^____||++____)):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))} ${@:$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))} ${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))};${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))} $(${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))} -${@:$((____=____^____||++____))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))} $_____|${@:$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}|${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))-$((____=____^____||++____)))):$((____=____^____||++____))} -${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}" " -${@:$((____=(____^____||++____)+(____^____||++____)))$((____=____^____||++____)):$((____=____^____||++____))}$((____=____^____||++____)))|${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))-$((____=____^____||++____)))):$((____=____^____||++____))}${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=____^____||++____)):$((____=____^____||++____))} -${@:$((____=____^____||++____))$(($((____=____^____||++____))-$((____=____^____||++____)))):$((____=____^____||++____))} "${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))-$((____=____^____||++____))))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))))${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))))${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))))$(($((____=____^____||++____))-$((____=____^____||++____))))${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))))$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))-$((____=____^____||++____))))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))$((____=____^____||++____))${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))))${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))"&&${@:$((____=(____^____||++____)+(____^____||++____)))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))}${@:$((____=____^____||++____))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))} "${@:$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____))))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=____^____||++____))+$((____=(____^____||++____)+(____^____||++____))))):$((____=____^____||++____))} ${@:$(($((____=(____^____||++____)+(____^____||++____)))+$((____=(____^____||++____)+(____^____||++____)))))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}${@:$((____=____^____||++____))$((____=(____^____||++____)+(____^____||++____))):$((____=____^____||++____))}${@:$((____=(____^____||++____)+(____^____||++____)))$(($((____=(____^____||++____)+(____^____||++____)))*$((____=(____^____||++____)+(____^____||++____)))+$((____=____^____||++____)))):$((____=____^____||++____))}!"&&printf "\n\033[?7l%1024s" " "&&echo SECCON{$S1$n$_____};echo -e '\033[?7h';

うわー!出たーーー!!これ、最近大流行(?)の難読化Shell芸では?!少ない競技時間をこの問題に当ててしまって若干公開していましたが、リアルタイムでこれが出てきた感動が味わえたので良し!
ちょっと調べてみると

超・記号オンリー難読化シェル芸

これじゃん!!!!!でもこのスライドを見ても読めるようにはなりません。。。最初の方の処理が何をしているか理解できた程度です…。とにかく実行してみます。

$ ./plain
Enter the assword

パスワードを要求されます。んー、パスワードなんて今まで出てきたっけな?
ここで最後のflagを表示してるっぽい箇所を確認してみます。

echo SECCON{$S1$n$_____}

一番上のブロックで、export s1=hogefuga; # ここ大事 で出てきたとおり s1=hogehugaです。また、一つ前の処理で出てきたexport n; ## ここ大事 で、n=3でした。あとは難読化されている$_____がわかればflagが出そう…!

というところでタイムアップでした。。。くやちい。。。アタイも難読化Shell芸問題解いた!って言いたかったわ!!!

passwordも$_____もわからんなーと思っていたのですが、最後の変態shellの一行ごとにechoを追加して表示してみたところ

$ ./plain
echo Enter the assword
read ____
: password is bash

なんと!passworはbashだそうです!!わからなかったのでunkoとか入れてみてたよ。清らかなshell芸だった。

read ____ とのことなので、ユーザーのinputが____に入るそうなので、flagは SECCON{hogefuga3bash}

[Misc] Welcome

Welcome to the SECCON CTF. Read rules and check the IRC topic.

Ruleを読むと

f:id:kusuwada:20191020203407p:plain

IRC Server: chat.freenode.net (freenode) PORT: 6667 / 6697 (SSL) Character Encoding: UTF-8 Channel: #seccon-quals Recommended IRC Client: http://limechat.net/ (Windows/Mac OS X/iOS) Web Chat: http://webchat.freenode.net/?channels=seccon-quals

とのことだったので、Clientを入れてアクセスしてみるとFlagが書いてありました。

f:id:kusuwada:20191020203425p:plain

flag: SECCON{Welcome to the SECCON 2019 Online CTF}

[Misc] Thank you for playing!

SECCON{We have done all the challenges. Thank you!}

そのまま入れるだけ。

感想

Web問を一問でも解きたかったなぁ。でも刺さりかけてる攻撃もあったので進歩した気がする。やっぱり解けるのはCrypto,Miscが中心。
まだまだ問題全部見れていませんが、事前に誰かが予言していた〇〇Payが出たり、大流行中の難読化シェル芸問題が出たりと楽しめました。

それと同時に、まだまだ自分は初心者レベルなことを痛感。Beginnersや初心者向けの基礎的な問題をこなしてまとめていくところから始めたほうが良さそう。

個人的には今回のこの状況(ワンオペ中)が中々笑えました。むしゅめたちほんと、かわええんやで…。