SECCON CTF 2019 Writeup
こんにちは。Repsterです。生きています。
SECCON CTF 2019に参加したのでWriteup。
coffee_break
暗号文とEncryptのコードから平文を出すやつ。
暗号文はFyRyZNBO2MG6ncd3hEkC/yeYKUseI/CxYoZiIeV2fe/Jmtwx+WbWmU1gtMX9m905
で、コードは
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'))
Base64で戻して、AESも鍵がわかるので戻す。 あとはencryptの逆関数を書く。剰余取っている部分はASCIIの範囲を考えて0or1回足す感じにした。
def decrypt(key, enc1): s = '' for i in range(len(enc1)): temp = ord(enc1[i]) - 0x20 temp -= ord(key[i % len(key)]) - 0x20 temp += 0x20 if temp <= 0x20 or 0x7f <= temp: temp += 0x7e - 0x20 + 1 s += chr(temp) return s
変なの付いてきたけどSECCON{Success_Decryption_Yeah_Yeah_SECCON}
Beeeeeeeeeer
難読化されたシェルスクリプトが渡されるので頑張って読み解く問題。 難読化シェル芸みたいなのでググると出てくる。なぜか実機では動かせなかった……
読みにくいのでとりあえず;
の後で改行するように整形した。
実際にシェルでコマンド実行してちょっとずつ書き換えていったのでつらくなった。
まず大事なのはクソ長echo文とそれのちょっと前。
$'\145\170\160\157\162\164' $'\u0053\u0031'=$(echo aG9nZWZ1Z2EK |base64 -d); echo -n <VERY-LONG-BASE64> | base64 -d | gunzip | bash;
1行目はecho $'\145\170\160\157\162\164'
みたいな感じで読み解いていくと、export S1=hogefuga
であるのがわかる。
2行目をgunzip
まで実行したものをファイルに出力すると、これまた難読化シェル芸。
次に大事なのもクソ長echo文とそのちょっと前。
echo <A-LITTLE-LONG-BASE64> | $'\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 <VERY-LONG-BASE64>|base64 -d|openssl aes-256-cbc -d -pass pass:$(echo -n $n|md5sum |cut -c2,3,5,12) -md md5 2>/dev/null |bash
これを書き換えると
echo -ne '\a'; sleep 1; echo -ne '\a'; sleep 1; echo -ne '\a'; sleep 1; echo "How many beeps?"; read n </dev/tty; export n; echo <VERY-LONG-BASE64> | openssl aes-256-cbc -d -pass pass:$(echo -n $n|md5sum |cut -c2,3,5,12) -md md5 2>/dev/null |bash;
このときn=3
なので、3を入れて一番下を実行すると、見た目は今までとは違うがまた難読化シェル芸。なに?????
これと同じことをやってるっぽい。
またがんばって少しずつ解読すると、Enter the Password
と聞かれたあとに入力を待つが、その後に: password is bash
というヒントがある。これは_____
もう少し解読すると、echo SECCON{$S1$n$_____}
とFlagを出しているところがあるので、これまでのをまとめるとSECCON{hogefuga3bash}
まとめ
日曜日にセキュリティスペシャリスト試験がなければもっと解けたと思う(負け惜しみ)。