去年に続き、今年もSECCON 2019 Online CTFに参加しました!
前から夫の出張と丸かぶりなのがわかっていたので問題収集で終わろうと思っていたのですが、短い時間でも思いの外楽しめました!数少ない&低得点問題のみですが、折角writeup書きながらやってたので記念に。
初日の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を読むと
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が書いてありました。
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や初心者向けの基礎的な問題をこなしてまとめていくところから始めたほうが良さそう。
次女の泣き声で起きる
— kusuwada (@kusuwada) October 19, 2019
→ 授乳しながら Thank you flag 入れる
→ 授乳後リバース(赤ちゃんはよく吐き戻すので心配不要)
→ もろもろ洗濯
→ さて、紅茶でも淹れるか
→ 長女「おがぁぁぢゃぁぁん」
→ THE END (GAME OVER) \(^o^)/
個人的には今回のこの状況(ワンオペ中)が中々笑えました。むしゅめたちほんと、かわええんやで…。