れぷすたぶろぐ

思ったことを適当に書く

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}

まとめ

日曜日にセキュリティスペシャリスト試験がなければもっと解けたと思う(負け惜しみ)。