VolgaCTF 2017 Teaser Writeup

この大会は2017/2/25 18:00(JST)~2017/2/26 0:00(JST)に開催されました。
今回もチームで参戦。結果は335点で292チーム中6位でした。
自分で解けた問題をWriteupとして書いておきます。

Now you see me (Crypto 150)

スクリプトと暗号化されたPNGファイルが添付されている。
スクリプトを読むと、IDATのデータ部が4バイトごとに暗号化されていることがわかる。CRC部に鍵を暗号化しているので、まず鍵を復号して、その鍵を使って復号するコードを書く。

def bytes2reg(m):
    L = 8
    pol = []
    dic = {'1' : 1, '0' : 0}
    for i in m:
        b = bin(ord(i)).split('b')
        b = b[1]
        b = '0'*(L - len(b)) + b
        for c in b:
            pol.append(dic[c])
    return pol

def reg2bytes(pol):
    res = ""
    if len(pol) % 8 != 0:
        pol.extend([0 for _ in range(8 - (len(pol) % 8))])
    b = [int(i) for i in pol]
    for i in range(4):
        ch = 0
        pw = 7
        for _ in range(8):
            ch += b.pop(0) * (2**pw)
            pw -= 1
        res += chr(ch)
    return res

def decrypt(c, k):
    dec = [0] * 32 + [i for i in c]
    for i in range(31, -1, -1):
        dec[i] = dec[32+i] ^ dec[31+i] ^ dec[16+i] ^ dec[1+i] ^ k[i]
    return dec[:32]

def key_decrypt(c):
    dec = [0] * 32 + [i for i in c]
    for i in range(31, -1, -1):
        dec[i] = dec[31+i] ^ dec[30+i] ^ dec[15+i]
    return dec[:32]

with open('file.png', 'rb') as f:
    file = f.read()

flag = file[:file.find('IDAT')]
flag += 'IDAT'

p = file.find('IDAT')
length = int(file[p-4:p].encode('hex'), 16)
l = length - (length % 4)
cnt = p + 4 + length + 4

e_key = file[cnt - 4:cnt]
key = key_decrypt(bytes2reg(e_key))

data = file[p+4:p+length+4]
for i in range(0, l, 4):
    block = data[i:i+4]
    block = bytes2reg(block)
    d = decrypt(block, key)
    flag += reg2bytes(d)

flag += file[p + 4 + l:p + 4 + length]
flag += reg2bytes(key)
flag += file[cnt:]

with open('flag.png', 'wb') as f:
    f.write(flag)

復号すると、画像にフラグが書いてある。
f:id:satou-y:20170301205853p:plain

VolgaCTF{Th3r3_4r3_tw0_kind5_0f_crypt0gr4phy_in_7his_w0r1d}

Quiz (Joy 10)

クイズというかVolgaCTF 2017 Qualsの大会参加の意思表明みたいなものだった。

Yes

WhiteHat Challenge 01 Writeup

この大会は2017/2/25 11:00(JST)~2017/2/25 19:00(JST)に開催されました。
今回もチームで参戦。結果は135点で70チーム中7位でした。
自分で解けた問題をWriteupとして書いておきます。

For001 (For 20)

LSB.pngが与えられている。ファイル名から考えてもLSBにフラグが隠されているに違いない。
Stegsolveで開き、[Analyse]-[Data Extract]からExtract Preview画面を表示し、
Red, Green, Blueの0を選択して、Previewを見ると、ZIPフォーマットが見える。

Save Binでout.binとして保存。

$ file out.bin 
out.bin: Microsoft Word 2007+

Wordで開いてみると、モールス信号が書いてある。

. .- ... -.-- ..-. --- .-. . -. ... .. -.-.

デコードすると、easyforensic

$ echo -n easyforensic | sha1sum
1f0aa393d3e5369f391c35a793bcf1178b8299a0  -
WhiteHat{1f0aa393d3e5369f391c35a793bcf1178b8299a0}

Crypto002 (Crypto 20)

暗号化スクリプトと暗号化した画像ファいるが与えられている。スクリプトから8バイトの鍵でXORをとっていることがわかる。
そこでXOR鍵を求め、それから元の画像を復元する。

with open('out.png', 'rb') as f:
    data = f.read()

PNG_HEAD = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]

key = []
for i in range(len(PNG_HEAD)):
    key.append(ord(data[i]) ^ PNG_HEAD[i])

flag = ''
for i in range(len(data)):
    code = ord(data[i]) ^ key[i%len(key)]
    flag += chr(code)

with open('images.png', 'wb') as f:
    f.write(flag)

復号した画像にflagが書いてある。
f:id:satou-y:20170228194758p:plain
Too_easy_right?

$ echo -n "Too_easy_right?" | sha1sum
5356be1427d77ea27062cb5417c887b01a019e11  -
WhiteHat{5356be1427d77ea27062cb5417c887b01a019e11}

Re001 (Re 15)

jarファイルが与えられている。このファイルをJD-UGIで開くと、以下のコード部分がフラグに関係していそう。

         :
  Character[] ListChar = { Character.valueOf('a'), Character.valueOf('_'), Character.valueOf('y'), Character.valueOf('l'), Character.valueOf('_'), Character.valueOf('l'), Character.valueOf('a'), Character.valueOf('T'), Character.valueOf('_'), Character.valueOf('T'), Character.valueOf('_'), Character.valueOf('T'), Character.valueOf('e'), Character.valueOf('_'), Character.valueOf('y'), Character.valueOf('e'), Character.valueOf('r'), Character.valueOf('_'), Character.valueOf('S'), Character.valueOf('_'), Character.valueOf('_'), Character.valueOf('l'), Character.valueOf('r'), Character.valueOf('T'), Character.valueOf('F'), Character.valueOf('_'), Character.valueOf('Y'), Character.valueOf('_'), Character.valueOf('l'), Character.valueOf('e'), Character.valueOf('T'), Character.valueOf('T'), Character.valueOf('T'), Character.valueOf('a'), Character.valueOf('r'), Character.valueOf('T'), Character.valueOf('u'), Character.valueOf('A'), Character.valueOf('o') };
  int[] ListPos = { 11, 7, 14, 13, 26, 22, 4, 34, 15, 37, 3, 31, 19, 27, 23, 6, 18, 25, 30, 24, 17, 12, 9, 38, 28, 8, 0, 16, 21, 10, 32, 36, 33, 20, 5, 35, 2, 29, 1 };
         :
  public String generateFlag()
  {
    String flag = "";
    Character[] tmpListChar = { Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0') };
    int lenFlag = this.ListChar.length;
    for (int i = 0; i < lenFlag; ++i) {
      tmpListChar[this.ListPos[i]] = this.ListChar[i];
    }
    for (i = 0; i < lenFlag; ++i) {
      flag = flag + tmpListChar[i];
    }
    return flag;
  }
         :

プログラムでフラグを構成してみる。

list_c = ['a', '_', 'y', 'l', '_', 'l', 'a', 'T', '_', 'T', '_', 'T', 'e', '_', 'y', 'e', 'r', '_', 'S', '_', '_', 'l', 'r', 'T', 'F', '_', 'Y', '_', 'l', 'e', 'T', 'T', 'T', 'a', 'r', 'T', 'u', 'A', 'o']

list_pos = [11, 7, 14, 13, 26, 22, 4, 34, 15, 37, 3, 31, 19, 27, 23, 6, 18, 25, 30, 24, 17, 12, 9, 38, 28, 8, 0, 16, 21, 10, 32, 36, 33, 20, 5, 35, 2, 29, 1]

flag = ['\0'] * 39
for i in range(len(list_c)):
    flag[list_pos[i]] = list_c[i]

print ''.join(flag)

flagは You_are__really___really____FASTTTTTTTT

$ echo -n You_are__really___really____FASTTTTTTTT | sha1sum
1e69c12b7b2bb6b895d39c4776ef8b34489149ab  -
WhiteHat{1e69c12b7b2bb6b895d39c4776ef8b34489149ab}

BSides San Francisco CTF Writeup

この大会は2017/2/12 9:00(JST)~2017/2/14 9:00(JST)に開催されました。
今回もチームで参戦。結果は3527点で727チーム中23位でした。
自分で解けた問題をWriteupとして書いておきます。

[]root (Crypto 250)

pcapファイルが与えられている。No.11のパケットから証明書をエクスポートし、証明書(公開鍵)の内容を見てみる。

$ openssl x509 -in 11.cer -text -pubkey -inform DER
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 11416077129378495227 (0x9e6e0daa0910fafb)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=New York, L=New York, O=E Corp, CN=pki.e-corp.com/emailAddress=pki@e-corp.com
        Validity
            Not Before: Feb  1 00:39:00 2017 GMT
            Not After : Feb  1 00:39:00 2018 GMT
        Subject: C=US, ST=New York, L=New York, O=E Corp, CN=pki.e-corp.com/emailAddress=pki@e-corp.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4103 bit)
                Modulus:
                    72:6f:6f:74:00:00:00:00:00:00:00:00:00:00:00:
                    00:00:00:00:00:00:1b:00:00:00:00:00:00:00:00:
                    00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
                    00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
                    00:00:00:00:00:1f:ff:ff:77:77:77:7b:00:00:00:
                    00:00:00:00:00:1f:ff:ff:ff:ff:ff:fb:00:00:00:
                    00:00:00:00:00:1f:ff:ff:ff:ff:fb:00:00:00:00:
                    00:00:00:00:00:1f:ff:ff:ff:ff:fb:00:00:00:00:
                    00:00:00:00:00:1f:ff:ff:ff:ff:ff:fb:00:00:00:
                    00:00:00:00:00:1f:ff:ff:22:22:22:2b:00:00:00:
                    00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
                    00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
                    00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
                    00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
                    00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
                    00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
                    00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
                    26:52:93:c4:42:2b:e3:53:26:38:fe:eb:2a:63:5e:
                    86:5e:5b:cc:d4:86:2d:14:91:f8:e4:6e:d4:1a:fd:
                    ab:32:ab:1e:91:3c:29:6c:45:a7:23:a3:71:cc:4a:
                    d2:18:d2:73:a4:94:ac:50:1a:1c:67:75:76:b8:4d:
                    3a:17:00:b2:4e:38:f3:d7:c8:09:0c:95:27:67:f8:
                    a9:da:53:2e:b4:49:6a:95:3f:a2:b2:64:1f:93:af:
                    58:32:1e:49:1a:d6:b3:e1:f6:60:0e:a1:75:76:35:
                    a2:d4:75:62:df:f2:f2:45:bf:c8:ed:51:14:20:93:
                    1d:e2:46:d5:63:34:d8:89:7d:64:65:b2:27:f6:c0:
                    95:ec:e1:ad:99:4c:75:51:f0:8d:bc:21:f8:b4:06:
                    91:ee:51:f5:f7:2d:05:2d:93:52:06:2f:90:b0:e7:
                    c5:2c:2e:b1:81:96:c2:c9:85:10:1a:f4:ea:c6:74:
                    99:39:6c:62:41:ad:4f:24:39:ed:11:f8:7d:67:e7:
                    3a:23:9b:86:5c:45:d6:5a:61:cf:0f:56:08:2d:e8:
                    31:b9:7f:b2:8a:e8:22:2a:71:95:e0:ec:06:c0:82:
                    81:ff:c1:6e:71:06:e7:7e:68:b8:c4:51:04:24:be:
                    eb:55:82:fe:21:cc:34:5f:53:53:46:82:b7:5c:36:
                    8d:73:c9
                Exponent: 31337 (0x7a69)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                4D:EC:FC:58:C3:9F:6B:A7:C9:0F:FC:0B:25:FD:46:F2:7C:AB:F8:44
            X509v3 Authority Key Identifier: 
                keyid:4D:EC:FC:58:C3:9F:6B:A7:C9:0F:FC:0B:25:FD:46:F2:7C:AB:F8:44

            X509v3 Basic Constraints: 
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         0d:f1:f7:4f:e1:a7:7d:0c:92:d7:29:69:09:0e:5a:49:2b:25:
         b5:95:1c:32:f6:6e:04:52:5e:fc:82:d1:9e:6a:6a:60:23:42:
         62:8a:37:24:7b:ac:f1:e6:d9:8b:d9:b7:53:a8:d5:c6:a9:9a:
         e8:7d:28:a2:41:74:1e:c5:1f:08:8c:de:7a:f1:28:f1:a9:ba:
         bf:fb:11:29:2a:3d:4f:d1:5b:a2:5f:86:ba:e8:09:30:d3:c4:
         40:67:b2:57:bd:80:b2:c9:bf:98:d2:9e:ab:2c:07:65:9f:5e:
         3f:44:8c:5f:d9:b7:a0:aa:85:5c:9d:f1:46:90:0c:7f:41:35:
         24:73:99:49:03:5f:a3:a8:45:26:c0:51:ce:0b:a5:e0:30:2a:
         59:4e:98:77:fb:4a:83:3c:af:09:e8:61:47:a5:80:1f:b0:8c:
         f0:7e:9a:b5:75:54:bd:b0:8f:05:9e:04:75:d8:c0:e6:4b:b5:
         6b:ba:20:0c:14:fb:4c:87:c3:e9:8f:47:ba:1e:23:70:9d:5b:
         bd:11:63:a3:45:e2:91:54:02:b2:af:f6:ff:cb:c7:bd:0e:b1:
         87:bf:19:11:59:93:77:1c:a0:f5:b7:1a:c1:24:d6:1d:b2:70:
         0b:96:ac:34:45:80:8d:27:53:45:15:d9:75:89:02:45:60:aa:
         ee:0e:8f:0a:a0:36:e8:2a:00:18:09:d9:0a:2d:78:bb:06:f4:
         14:b4:04:2c:f6:c0:b6:5c:a3:f8:28:1b:91:b5:2b:9e:e4:af:
         35:cf:fb:b8:7b:ed:9f:73:7b:b6:14:a8:5e:21:5f:a0:66:76:
         3d:25:65:07:ff:02:ed:24:1f:07:d9:6a:79:db:c1:7f:ce:83:
         2c:bd:2f:1c:3a:22:41:a3:f3:30:27:b4:01:59:49:32:90:32:
         96:f0:a2:8b:b7:36:61:64:cf:7e:c1:97:bd:7b:25:e8:74:65:
         f4:d4:71:21:24:ba:10:95:c0:f7:9c:4d:c9:e8:82:1e:71:4d:
         d6:3b:9b:5c:f2:72:01:41:cc:34:f7:42:e2:e8:f5:a2:9c:21:
         61:08:5c:d4:b5:bf:fe:f4:ce:9f:b8:0e:fc:a8:9d:9f:8e:0f:
         a3:f6:41:98:73:77:cc:0b:d9:7b:5a:1f:54:fd:1f:75:bd:ba:
         d0:a1:de:ac:6f:43:a9:64:31:07:91:de:b4:0e:53:da:0d:08:
         07:dc:0a:f1:8a:03:30:6b:75:f5:96:43:b3:75:30:79:a9:8e:
         fd:06:5e:d1:c4:54:09:c7:f3:2f:69:a9:5a:8d:33:02:09:9d:
         4e:a3:63:33:66:ca:9a:82:f8:5f:5b:dc:3f:45:16:35:de:68:
         d2:17:bf:0b:15:b9:d9:ae:8b
-----BEGIN PUBLIC KEY-----
MIICITANBgkqhkiG9w0BAQEFAAOCAg4AMIICCQKCAgFyb290AAAAAAAAAAAAAAAA
AAAAAAAbAAAAAAAAAAAAAAAAAB//+wAAAAAAAAAAAAAAAB//+wAAAAAAAAAAAAAA
AB///3d3d3sAAAAAAAAAAB////////sAAAAAAAAAAB//////+wAAAAAAAAAAAB//
////+wAAAAAAAAAAAB////////sAAAAAAAAAAB///yIiIisAAAAAAAAAAB//+wAA
AAAAAAAAAAAAAB//+wAAAAAAAAAAAAAAAB//+wAAAAAAAAAAAAAAAB//+wAAAAAA
AAAAAAAAAB//+wAAAAAAAAAAAAAAAB//+wAAAAAAAAAAAAAAAB//+wAAAAAAAAAm
UpPEQivjUyY4/usqY16GXlvM1IYtFJH45G7UGv2rMqsekTwpbEWnI6NxzErSGNJz
pJSsUBocZ3V2uE06FwCyTjjz18gJDJUnZ/ip2lMutElqlT+ismQfk69YMh5JGtaz
4fZgDqF1djWi1HVi3/LyRb/I7VEUIJMd4kbVYzTYiX1kZbIn9sCV7OGtmUx1UfCN
vCH4tAaR7lH19y0FLZNSBi+QsOfFLC6xgZbCyYUQGvTqxnSZOWxiQa1PJDntEfh9
Z+c6I5uGXEXWWmHPD1YILegxuX+yiugiKnGV4OwGwIKB/8FucQbnfmi4xFEEJL7r
VYL+Icw0X1NTRoK3XDaNc8kCAnpp
-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

nをFermat法で素因数分解してみる。

def isqrt(n):
    x = n
    y = (x + n // x) // 2
    while y < x:
        x = y
        y = (x + n // x) // 2
    return x

def fermat(n):
    x = isqrt(n) + 1
    y = isqrt(x * x - n)

    while True:
        w = x * x - n - y * y
        if w == 0:
            break
        elif w > 0:
            y += 1
        else:
            x += 1
    return x - y, x + y

n = 0x726f6f7400000000000000000000000000000000001b000000000000000000000000001ffffb0000000000000000000000001ffffb0000000000000000000000001fffff7777777b00000000000000001ffffffffffffb00000000000000001ffffffffffb0000000000000000001ffffffffffb0000000000000000001ffffffffffffb00000000000000001fffff2222222b00000000000000001ffffb0000000000000000000000001ffffb0000000000000000000000001ffffb0000000000000000000000001ffffb0000000000000000000000001ffffb0000000000000000000000001ffffb0000000000000000000000001ffffb00000000000000265293c4422be3532638feeb2a635e865e5bccd4862d1491f8e46ed41afdab32ab1e913c296c45a723a371cc4ad218d273a494ac501a1c677576b84d3a1700b24e38f3d7c8090c952767f8a9da532eb4496a953fa2b2641f93af58321e491ad6b3e1f6600ea1757635a2d47562dff2f245bfc8ed511420931de246d56334d8897d6465b227f6c095ece1ad994c7551f08dbc21f8b40691ee51f5f72d052d9352062f90b0e7c52c2eb18196c2c985101af4eac67499396c6241ad4f2439ed11f87d67e73a239b865c45d65a61cf0f56082de831b97fb28ae8222a7195e0ec06c08281ffc16e7106e77e68b8c4510424beeb5582fe21cc345f53534682b75c368d73c9
p, q = fermat(n)
print 'p =', p
print 'q =', q

実行結果は以下の通り。

p = 345709341936068338730678003778405323582109317075021198605451259081268526297654818935837545259489748700537817158904946124698593212156185601832821337576558516676594811692389205842412600462658083813048872307642872332289082295535733483056820073388473845450507806559178316793666044371642249466611007764799781626418800031166072773475575269610775901034485376573476373962417949231752698909821646794161147858557311852386822684705642251949742285300552861190676326816587042282505137369676427345123087656274137257931639760324708350318503061363031086796994100943084772281097123781070811610760735943618425858558459014484742232018933
q = 345709341936068338730678003778405323582109317075021198605451259081268526297654818935837545259489748700537817158904946124698593212156185601832821337576558516676594811692389205842412600462658083813048872307642872332289082295535733483056820073388473845450507806559178316793666044371642249466611007764799781626418800031166072773475575269610775901034485376573476373962417949231752698909821646794161147858557311852386822684705642251949742285300552861190676326816587042282505137369676427345123087656274137257931639760324708350318503061363031086796994100943084772281097123781070811610760735943618425858558459014484742232019973

pとqがわかったので、秘密鍵を作成する。

$ rsatool.py -f PEM -o secret.pem -p 345709341936068338730678003778405323582109317075021198605451259081268526297654818935837545259489748700537817158904946124698593212156185601832821337576558516676594811692389205842412600462658083813048872307642872332289082295535733483056820073388473845450507806559178316793666044371642249466611007764799781626418800031166072773475575269610775901034485376573476373962417949231752698909821646794161147858557311852386822684705642251949742285300552861190676326816587042282505137369676427345123087656274137257931639760324708350318503061363031086796994100943084772281097123781070811610760735943618425858558459014484742232018933 -q 345709341936068338730678003778405323582109317075021198605451259081268526297654818935837545259489748700537817158904946124698593212156185601832821337576558516676594811692389205842412600462658083813048872307642872332289082295535733483056820073388473845450507806559178316793666044371642249466611007764799781626418800031166072773475575269610775901034485376573476373962417949231752698909821646794161147858557311852386822684705642251949742285300552861190676326816587042282505137369676427345123087656274137257931639760324708350318503061363031086796994100943084772281097123781070811610760735943618425858558459014484742232019973 -e 31337
Using (p, q) to initialise RSA instance

n =
726f6f7400000000000000000000000000000000001b000000000000000000000000001ffffb0000
000000000000000000001ffffb0000000000000000000000001fffff7777777b0000000000000000
1ffffffffffffb00000000000000001ffffffffffb0000000000000000001ffffffffffb00000000
00000000001ffffffffffffb00000000000000001fffff2222222b00000000000000001ffffb0000
000000000000000000001ffffb0000000000000000000000001ffffb000000000000000000000000
1ffffb0000000000000000000000001ffffb0000000000000000000000001ffffb00000000000000
00000000001ffffb00000000000000265293c4422be3532638feeb2a635e865e5bccd4862d1491f8
e46ed41afdab32ab1e913c296c45a723a371cc4ad218d273a494ac501a1c677576b84d3a1700b24e
38f3d7c8090c952767f8a9da532eb4496a953fa2b2641f93af58321e491ad6b3e1f6600ea1757635
a2d47562dff2f245bfc8ed511420931de246d56334d8897d6465b227f6c095ece1ad994c7551f08d
bc21f8b40691ee51f5f72d052d9352062f90b0e7c52c2eb18196c2c985101af4eac67499396c6241
ad4f2439ed11f87d67e73a239b865c45d65a61cf0f56082de831b97fb28ae8222a7195e0ec06c082
81ffc16e7106e77e68b8c4510424beeb5582fe21cc345f53534682b75c368d73c9

e = 31337 (0x7a69)

d =
618caed447e3b3a23fe661970669b19fc8517f1affef47db561cb4eec562b589878940899882f490
236c017870796d86753252ae97d1d1b6869490ec30867fa71e7062aecf0057fcae6bfb324c5133d1
693cc566e44c48c1ee139f5fc079d203feebf1c911d1bcccb8b925e5adbc6a851c2072bebcea000c
8c4850736a69c0865e310824f9e7de36429cb3e32ff88bf7ef4ccb39e7585de9ed3a1feaea85d087
486ba35c521e0be928a478d51a5915f3672b673c2247383670ba5991427b3dcce8d2e5c4bd7e7c0f
0a3a96eff4a0de771767a8e20f46c97a8e5f9d7878d6f3116cce6bb8462014be21875d557137bd24
8eb3590d95fce7a17bdcbdd223465cc017d6fc76fbfe2e4b9ccc49241ba452fdf84d1c8185cad33a
83c5b5ac43d946df4c3648af4f7714cd584db1ecd14458c8827ac222c3ca08280c2ba687c19aa8df
77d498cfaf700c9019f505380a78ba43f2f1bcd82a15e19c4daa3b33051d31aec1a94e043f81b7fb
21af1975588fdaa0dbfb269f118e5c4e9e26922c1440ab85357aab110361662927b74f2fe27825ba
e9e9d7aa341d8341b93588eda2e780cd99ad790ac28146f113b3d09f470e64c07a0bd51d8b4b7470
c9a931414305a53fda0a168561a2b8906ce7ff4215c0912248d55ca3e0499af1f59877b78a07a377
e570f1b9fe70b9b5cd9461bf6bc39f8734ea07b4e3f6a71129179b4183d3e4f0a9

p =
ab28ba5dbd67a4b8b4c20b76958ad57ef5513ea01af2ad59b1691a4b60e7eee058aa4776bc96a3b7
b3b3ab98a743ff0e16c22033481dfd0c83654311e153b14d5067ea4664d419b97ba28a6ee5693b00
acb7c7046762b0d8ece2bdbdc4c784923178beb1c8c78fd123003f4c107f2aa772a7f22f3052ee69
561a265acf618513acd76321d2c3a6dcd6456152c4032d8fd285ee013746eb1439f4c9c66b9ffd90
3b63208bbb0bf82b52cfc6bd12df96f3d9fa12c96456fd94e7f5c1238b3d5089e6be64ac555f8468
3ede12cc1ffa1a66fbe5e4d2c830e14d6954c48747bc1cec60582a312ee97274a9f7211e3213ff20
81d9f69b07a7b0fa8f89edd037e730ff5

q =
ab28ba5dbd67a4b8b4c20b76958ad57ef5513ea01af2ad59b1691a4b60e7eee058aa4776bc96a3b7
b3b3ab98a743ff0e16c22033481dfd0c83654311e153b14d5067ea4664d419b97ba28a6ee5693b00
acb7c7046762b0d8ece2bdbdc4c784923178beb1c8c78fd123003f4c107f2aa772a7f22f3052ee69
561a265acf618513acd76321d2c3a6dcd6456152c4032d8fd285ee013746eb1439f4c9c66b9ffd90
3b63208bbb0bf82b52cfc6bd12df96f3d9fa12c96456fd94e7f5c1238b3d5089e6be64ac555f8468
3ede12cc1ffa1a66fbe5e4d2c830e14d6954c48747bc1cec60582a312ee97274a9f7211e3213ff20
81d9f69b07a7b0fa8f89edd037e731405

Saving PEM as secret.pem

Wiresharkで以下の設定によりSSLの復号をし、SSL Streamを見る。

  • IP address: 4.3.2.1
  • Port: 443
  • Protocol: http
  • Key File: secret.pem
GET /modulus.txt HTTP/1.0
Host: 4.3.2.1
User-Agent: E Corp PKI Modulus Fetch
Accept: */*

HTTP/1.0 200 ok
Content-type: text/plain

72:6f:6f:74:00:00:00:00:00:00:00:00:00:00:00:
00:00:00:00:00:00:1b:00:00:00:00:00:00:00:00:
00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
00:00:00:00:00:1f:ff:ff:77:77:77:7b:00:00:00:
00:00:00:00:00:1f:ff:ff:ff:ff:ff:fb:00:00:00:
00:00:00:00:00:1f:ff:ff:ff:ff:fb:00:00:00:00:
00:00:00:00:00:1f:ff:ff:ff:ff:fb:00:00:00:00:
00:00:00:00:00:1f:ff:ff:ff:ff:ff:fb:00:00:00:
00:00:00:00:00:1f:ff:ff:22:22:22:2b:00:00:00:
00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
00:00:00:00:00:1f:ff:fb:00:00:00:00:00:00:00:
00:00:00:00:1f:ff:00:ff:fb:00:00:00:00:00:00:
00:00:00:00:1f:00:00:00:fb:00:00:00:00:00:00:
00:00:00:1f:00:00:00:00:00:fb:00:00:00:00:00:
00:00:00:1f:00:00:00:00:00:fb:00:00:00:00:00:
00:00:1f:00:00:00:00:00:00:00:fb:00:00:00:00:
00:00:1f:00:00:00:00:00:00:00:fb:00:00:00:00:
00:00:00:1f:00:00:00:00:00:fb:00:00:00:00:00:
00:00:00:1f:00:00:00:00:00:fb:00:00:00:00:00:
00:00:00:00:1f:00:00:00:fb:00:00:00:00:00:00:
00:00:00:00:1f:ff:00:ff:fb:00:00:00:00:00:00:
00:00:00:00:00:00:1b:00:00:00:00:00:00:00:00:
00:00:00:00:00:00:00:00:00:00:00:00:66:6c:61:
67:3a:77:68:65:6e:5f:73:6f:6c:76:69:6e:67:5f:
70:72:6f:62:6c:65:6d:73:5f:64:69:67:5f:61:74:
5f:74:68:65:5f:72:6f:6f:74:73:5f:69:6e:73:74:
65:61:64:5f:6f:66:5f:6a:75:73:74:5f:68:61:63:
6b:69:6e:67:5f:61:74:5f:74:68:65:5f:6c:65:61:
76:65:73

最後の66:6c:61:からフラグのASCIIコードのようなので、デコードする。

enc = '66:6c:61:67:3a:77:68:65:6e:5f:73:6f:6c:76:69:6e:67:5f:70:72:6f:62:6c:65:6d:73:5f:64:69:67:5f:61:74:5f:74:68:65:5f:72:6f:6f:74:73:5f:69:6e:73:74:65:61:64:5f:6f:66:5f:6a:75:73:74:5f:68:61:63:6b:69:6e:67:5f:61:74:5f:74:68:65:5f:6c:65:61:76:65:73'

dec = enc.replace(':', '').decode('hex')
print dec

実行結果は以下の通り。

flag:when_solving_problems_dig_at_the_roots_instead_of_just_hacking_at_the_leaves
when_solving_problems_dig_at_the_roots_instead_of_just_hacking_at_the_leaves

nullcon HackIM Writeup

この大会は2017/2/11 1:30(JST)~2017/2/12 13:30(JST)に開催されました。
今回もチームで参戦。結果は1950点で363チーム中48位でした。
自分で解けた問題をWriteupとして書いておきます。

Programming Question 1 (Programming 200)

3色のデータが全部で528601個ある。
factordbで素因数分解すると、528601 = 569 × 929
幅、高さをこの長さにして画像にしてみる。

from PIL import Image

with open('abc.txt', 'r') as f:
    data = f.read()

data = data[2:-3]
colors = data.split('), (')

WIDTH = 929
HEIGHT = 569 
img = Image.new('RGB', (WIDTH, HEIGHT), (255, 255, 255))

i = 0
for y in range(HEIGHT):
    for x in range(WIDTH):
        rgb = colors[i].split(', ')
        img.putpixel((x, y), (int(rgb[0]), int(rgb[1]), int(rgb[2])))
        i += 1

img.save('flag.png')

画像の右下にフラグがある。
f:id:satou-y:20170217224554p:plain

flag{Pil_PIL_PIL}

Programming Question 3 (Programming 300)

何重にもいろんなアーカイブ方法で圧縮されている。都度対応する展開・解凍方法で戻していく。

import subprocess
import os

cmd_file = 'file %s'
cmd_lzma = 'xz -d %s'
cmd_tar = 'tar xvf %s'
cmd_xz = 'xz -d %s'
cmd_gz = 'gzip -d %s'
cmd_bz2 = 'bzip2 -d %s'
cmd_shk = 'nulib2 -x %s'
cmd_lz = 'lzip --decompress %s'
cmd_zpaq = 'zpaq x %s'
cmd_zoo = 'zoo x %s'
cmd_7z = '7z e %s'
cmd_arj = 'arj e %s'
cmd_zip = 'unzip %s'

filename_base = '26685'
filename_lzma = '26685.lzma'
filename_tar = '26685.tar'
filename_xz = '26685.xz'
filename_gz = '26685.gz'
filename_bz2 = '26685.bz2'
filename_shk = '26685.shk'
filename_lz = '26685.lz'
filename_zpaq = '26685.zpaq'
filename_zoo = '26685.zoo'
filename_7z = '26685.7z'
filename_arj = '26685.arj'
filename_zip = '26685.zip'

i = 1
while True:
    print '%d times' % i
    cmd = cmd_file % filename_base
    ret = subprocess.check_output( cmd.split(" ") )
    print ret
    if 'LZMA compressed' in ret:
        os.rename(filename_base, filename_lzma)
        os.system(cmd_lzma % filename_lzma)
    elif 'tar archive' in ret:
        os.rename(filename_base, filename_tar)
        os.system(cmd_tar % filename_tar)
        os.remove(filename_tar)
    elif 'XZ compressed' in ret:
        os.rename(filename_base, filename_xz)
        os.system(cmd_xz % filename_xz)
    elif 'gzip compressed' in ret:
        os.rename(filename_base, filename_gz)
        os.system(cmd_gz % filename_gz)
    elif 'bzip2 compressed' in ret:
        os.rename(filename_base, filename_bz2)
        os.system(cmd_bz2 % filename_bz2)
    elif 'NuFile archive' in ret:
        os.rename(filename_base, filename_shk)
        os.system(cmd_shk % filename_shk)
        os.remove(filename_shk)
    elif 'lzip compressed' in ret:
        os.rename(filename_base, filename_lz)
        os.system(cmd_lz % filename_lz)
    elif 'ZPAQ stream' in ret:
        os.rename(filename_base, filename_zpaq)
        os.system(cmd_zpaq % filename_zpaq)
        os.remove(filename_zpaq)
    elif 'Zoo archive' in ret:
        os.rename(filename_base, filename_zoo)
        os.system(cmd_zoo % filename_zoo)
        os.remove(filename_zoo)
    elif '7-zip archive' in ret:
        os.rename(filename_base, filename_7z)
        os.system(cmd_7z % filename_7z)
        os.remove(filename_7z)
    elif 'ARJ archive' in ret:
        os.rename(filename_base, filename_arj)
        os.system(cmd_arj % filename_arj)
        os.remove(filename_arj)
    elif 'Zip archive' in ret:
        os.rename(filename_base, filename_zip)
        os.system(cmd_zip % filename_zip)
        os.remove(filename_zip)
    else:
        break
    i += 1

254回解凍すると、次のテキストが得られる。

total 120
drwx------ 2 root     root     28672 Dec 23 21:01 apt-dpkg-install-kKBLWj
-rw-r--r-- 1 root     root     71259 Dec 23 19:50 apt-fast.list
-rw-r--r-- 1 root     root         0 Dec 23 19:50 apt-fast.lock
-rw-r--r-- 1 root     root         0 Dec 23 21:03 secr
drwx------ 3 root     root      4096 Dec 23 19:30 systemd-private-20af98806288452f91376e836938dc35-colord.service-hbUpEj
drwx------ 3 root     flag      4096 Dec 23 19:30 63336C756448746861486C35634442684C565A686353467566513D3D

flagグループの16進数のファイル名をデコードしていくと、フラグが得られる。

enc ='63336C756448746861486C35634442684C565A686353467566513D3D'
print enc.decode('hex').decode('base64').decode('rot13')
flag{nullc0n-Ind!a}

Crypto Question 2 (Crypto 350)

図にあるa, bの組み合わせを答える問題。
f:id:satou-y:20170217224929p:plain
総当たりでa, bの組み合わせを探す。

def search_log(g, ga, q):
    list_log = []
    for i in range(2, 1001):
        if pow(g, i, q) == ga:
            list_log.append(i)
    return list_log

q = 541
g = 10
ga = 298
gb = 330
list_a = search_log(g, ga, q)
list_b = search_log(g, gb, q)

for a in list_a:
    for b in list_b:
        if pow(g, a * b, q) == 399:
            print 'flag{%d,%d}' % (a, b)

実行結果は以下の4通り。

flag{170,268}
flag{170,808}
flag{710,268}
flag{710,808}

フラグが通ったのは、このうち一つ。

flag{170,808}

Misc2 (Misc 300)

$ file artefact 
artefact: XZ compressed data
$ mv artefact artefact.xz
$ xz -d artefact.xz
$ file artefact 
artefact: Linux rev 1.0 ext3 filesystem data, UUID=c6666f0c-f641-4958-be07-bcc6540fdafd (large files)

FTK Imagerで開く。
[unallocated space]の09837がJPEGのようだ。
ヘッダを書き換えFF D8 FF E0にし、FF D9より後ろを切り落とすと、JPEG画像になりフラグが書いてあった。
f:id:satou-y:20170217225435j:plain

flag{i_h@te_stupid_color$}

Hackcon Mini Writeup

この大会は2017/2/11 23:30(JST)~2017/2/12 3:29(JST)に開催されました。
今回もチームで参戦。結果は400点で110チーム中19位でした。
自分で解けた問題はWelcome問題だけです。一応Writeupとして書いておきます。

Welcome (Misc 5)

Telegramにjoinしようとしたら、フラグが表示された。

d4rk{Welcome_to_HCN_mini}c0de

Codegate 2017 prequals Writeup

この大会は2017/2/10 9:00(JST)~2017/2/11 9:00(JST)に開催されました。
今回もチームで参戦。結果は100点で300チーム中119位でした。
自分で解けた問題はWelcome問題だけです。一応Writeupとして書いておきます。

Mic Check (50)

問題にフラグ「FLAG{Welcome_to_codegate2017}」が書いてある。
ブラケットの中がsubmitするフラグ。

Welcome_to_codegate2017

AlexCTF Writeup

この大会は2017/2/3 19:00(JST)~2017/2/6 19:00(JST)に開催されました。
今回もチームで参戦。結果は2040点で1029チーム中63位でした。
自分で解けた問題をWriteupとして書いておきます。

CR1: Ultracoded (Cryotography 50)

ONE, ZEROのスペース区切りの文字列。0,1に置き換え、2進数のASCIIコードとして文字に変換する。さらにBase64文字列になるので、デコードする。

with open('zero_one', 'r') as f:
    data = f.read()

data = data.replace('\n', '').split(' ')

b_data = ''
for i in range(len(data)):
    if data[i] == 'ZERO':
        b_data += '0'
    else:
        b_data += '1'

b64_data = ''
for i in range(0, len(b_data), 8):
    code = int(b_data[i:i+8], 2)
    b64_data += chr(code)

print b64_data.decode('base64')

すると、モールス信号が出てきた。

.- .-.. . -..- -.-. - ..-. - .... .---- ..... --- .---- ... --- ..... ..- .--. ...-- .-. --- ..... . -.-. .-. ...-- - --- - -..- -

Onlineツールで復号する。

ALEXCTFTH15O1SO5UP3RO5ECR3TOTXT

"O"を"_"に変換する。

ALEXCTFTH15_1S_5UP3R_5ECR3T_TXT

{ }を付ける。

ALEXCTF{TH15_1S_5UP3R_5ECR3T_TXT}

CR3: What is this encryption (Cryotography 150)

eが非常に大きいRSA暗号の復号問題。Wiener's Attackの一部を流用し、復号する。

def egcd(a, b):
    x,y, u,v = 0,1, 1,0
    while a != 0:
        q, r = b//a, b%a
        m, n = x-u*q, y-v*q
        b,a, x,y, u,v = a,r, u,v, m,n
        gcd = b
    return gcd, x, y

def decrypt(p, q, e, c):
    n = p * q
    phi = (p - 1) * (q - 1)
    gcd, a, b = egcd(e, phi)
    d = a
    pt = pow(c, d, n)
    return hex(pt)[2:-1].decode('hex')

p = 0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9
q = 0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307
e = 0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41
c = 0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520

plaintext = decrypt(p, q, e, c)
print plaintext
ALEXCTF{RS4_I5_E55ENT1AL_T0_D0_BY_H4ND}

CR4: Poor RSA (Cryotography 200)

公開鍵と暗号化データをBASE64エンコードしたファイルが与えられている。
flag.b64をBASE64デコードしたファイルをflag.encとする。
公開鍵の内容を見てみる。

$ openssl rsa -pubin -text < key.pub
Public-Key: (399 bit)
Modulus:
    52:a9:9e:24:9e:e7:cf:3c:0c:bf:96:3a:00:96:61:
    77:2b:c9:cd:f6:e1:e3:fb:fc:6e:44:a0:7a:5e:0f:
    89:44:57:a9:f8:1c:3a:e1:32:ac:56:83:d3:5b:28:
    ba:5c:32:42:43
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
ME0wDQYJKoZIhvcNAQEBBQADPAAwOQIyUqmeJJ7nzzwMv5Y6AJZhdyvJzfbh4/v8
bkSgel4PiURXqfgcOuEyrFaD01soulwyQkMCAwEAAQ==
-----END PUBLIC KEY-----

次のnの値をfactordbで素因数分解する。

n = 0x52a99e249ee7cf3c0cbf963a009661772bc9cdf6e1e3fbfc6e44a07a5e0f894457a9f81c3ae132ac5683d35b28ba5c324243
(= 833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019)

この結果は以下のp, qの値となる。

p = 863653476616376575308866344984576466644942572246900013156919
q = 965445304326998194798282228842484732438457170595999523426901

この結果から秘密鍵を作成する。

$ rsatool.py -f PEM -o key.pri -p 863653476616376575308866344984576466644942572246900013156919 -q 965445304326998194798282228842484732438457170595999523426901
Using (p, q) to initialise RSA instance

n =
52a99e249ee7cf3c0cbf963a009661772bc9cdf6e1e3fbfc6e44a07a5e0f894457a9f81c3ae132ac
5683d35b28ba5c324243

e = 65537 (0x10001)

d =
33ad09ca06f50f9e90b1acae71f390d6b92f1d6d3b6614ff871181c4df08da4c5f5012457a643094
05eaecd6341e43027931

p =
899683060c76b9c0de581a69e0ea9d91bed1071beb1d924a37

q =
99cde74aedee87adffdd684cbc478e759870b4f20692f65255

Saving PEM as key.pri

秘密鍵を使って、暗号データを復号する。

$ openssl rsautl -decrypt -inkey key.pri < flag.enc
ALEXCTF{SMALL_PRIMES_ARE_BAD}
ALEXCTF{SMALL_PRIMES_ARE_BAD}

SC1: Math bot (Scripting 100)

計算問題を解いていくだけ。

#!/usr/bin/env python
import socket
import re

pattern = 'Question  (.+) :\n(.+)'

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('195.154.53.62', 1337))

for i in range(1000):
    data = s.recv(1024)
    print data
    m = re.search(pattern, data)
    formula = m.group(2)
    formula = formula.replace('=', '')
    ans = str(eval(formula)) + '\n'
    print ans
    s.sendall(ans)

data = s.recv(1024)
print data

500回正解すると、フラグが表示された。

ALEXCTF{1_4M_l33t_b0t}

SC2: Cutie cat (Scripting 150)

画像のステガノグラフィの問題。いろいろ試したみたが、なかなかうまくいかなかった。PythonのSteganographyライブラリを使ったら、簡単にフラグを抽出できた。

from steganography.steganography import Steganography

secret_text = Steganography.decode('cat_with_secrets.png')
print secret_text
ALEXCTF{CATS_HIDE_SECRETS_DONT_THEY}

TR1: Hello there (Trivia 10)

freenodeで#alexctfに入る。

    :
19:14 *topic : Alexandria University student held capture the flag event ctf.oddcoder.com ALEXCTF{W3_w15h_y0u_g00d_luck}
ALEXCTF{W3_w15h_y0u_g00d_luck}

TR3: CA (Trivia 20)

AlexctfのHTTPS証明書の発行CAを答える問題。
証明書の発行者を見る。
f:id:satou-y:20170214194426p:plain

letsencrypt