InCTF 2018 Writeup

この大会は2018/10/6 20:00(JST)~2018/10/8 8:00(JST)に開催されました。
今回もチームで参戦。結果は 2120点で306チーム中24位でした。
自分で解けた問題は参加賞の問題だけですが、Writeupとして書いておきます。

Sanity check (Trivia)

freenodeで#bi0s-ctfチャネルに入る。

20:03 *topic : Official channel for InCTF | flag for Sanity Check - inctf{W3lc0me_to_our_CTF!!} | CTF has started!! |  Register at https://ctf.inctf.in/ | Read rules at https://ctf.inctf.in/rules/ | Organised by team bi0s - https://bi0s.in
inctf{W3lc0me_to_our_CTF!!}

Hackover CTF 2018 Writeup

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

UnbreakMyStart (forensics)

xzのフォーマットだとしたら、先頭が壊れている。以下のように修正する。

(修正前)50 4B 03 04 14 00 08 00 08 00 04
(修正後)FD 37 7A 58 5A 00 00 04

解凍すると、flag.txtが展開され、フラグが書いてあった。

hackover18{U_f0und_th3_B3st_V3rs10n}

DefCamp CTF Qualification 2018 Writeup

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

XORnigma (Junior)

XOR暗号。フラグはDCTF{で始まることを考慮し、キーを割り出す。キーの1バイト目と5バイト目が同じなので、4バイトと考え、復号する。

import itertools

def xor_two_str(s, key):
    key = key * (len(s) / len(key) + 1)
    return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in itertools.izip(s, key))

enc = '000000003f2537257777312725266c24207062777027307574706672217a67747374642577263077777a3725762067747173377326716371272165722122677522746327743e'
enc = enc.decode('hex')
flag_head = 'DCTF{'

key = ''
for i in range(len(flag_head)):
    key += chr(ord(enc[i]) ^ ord(flag_head[i]))
key = key[:4]

flag = xor_two_str(enc, key)
print flag
DCTF{fcc34eaae8bd3614dd30324e932770c3ed139cc2c3250c5b277cb14ea33f77a0}

Multiple Flags (Junior)

手旗信号の画像。
f:id:satou-y:20180926185751p:plain
https://ja.wikipedia.org/wiki/%E6%89%8B%E6%97%97%E4%BF%A1%E5%8F%B7を参考に、文字にしていく。

(文字)DCTFSPECIALFLAG(数字)00(文字)AA(数字)00(文字)AA(数字)00991337(文字)DCTF
DCTFSPECIALFLAG00AA00AA00991337DCTF

Passport (Junior)

demo.binと異なるバイナリで、md5が同じファイルをアップロードすればフラグが表示されるようだ。
試しにdemo.binのmd5の値で調べてみる。

cee9a457e790cf20d4bdaa6d69f01e41

http://www.xefan.com/archives/83875.htmlに衝突する2つのファイルが書いてあり、片方はdemo.binと一致する。もう一つのバイナリを作成すればよい。
バイナリエディタでdemoの一部を修正する。

・オフセット0x15:0x70→0x74
・オフセット0x2b:0x5c→0xdc

この作成したバイナリファイルをアップロードすると、フラグが表示された。

DCTF{04c8d0052e3ffd8d21934e392c272a0494f23433901941c93fab82b50be27c1a}

Ransomware (Reverse)

ransomware.pycをEasyPythonDecompilerでデコンパイルする。

import string
from random import *
import itertools

def caesar_cipher(OOO0O0O00OOO0O0OO, O0O0O0O0OOOO0OOOO):
    O0O0O0O0OOOO0OOOO = O0O0O0O0OOOO0OOOO * (len(OOO0O0O00OOO0O0OO) / len(O0O0O0O0OOOO0OOOO) + 1)
    return ''.join((chr(ord(O0O0O00O0000O00O0) ^ ord(OO0000000O0OO00OO)) for O0O0O00O0000O00O0, OO0000000O0OO00OO in itertools.izip(OOO0O0O00OOO0O0OO, O0O0O0O0OOOO0OOOO)))


f = open('./FlagDCTF.pdf', 'r')
buf = f.read()
f.close()
allchar = string.ascii_letters + string.punctuation + string.digits
password = ''.join((choice(allchar) for OOO0OO0OO00OO0000 in range(randint(60, 60))))
buf = caesar_cipher(buf, password)
f = open('./youfool!.exe', 'w')
buf = f.write(buf)
f.close()

cease_cipher関数は読みにくいので、置き換える。

def caesar_cipher(x, y):
    y = y * (len(x) / len(y) + 1)
    return ''.join((chr(ord(a) ^ ord(b)) for a, b in itertools.izip(x, y)))

簡単に言えば, XOR関数で、実行している部分を見ると、鍵の長さは60であることがわかる。PDFに復号できることを前提に少しずつ調整しながら鍵を見つけていく。

def str_xor(s1, s2):
    return ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(s1, s2))

with open('youfool!.exe', 'rb') as f:
    data = f.read()

key = ''
#### key 0-6
PDF_HEAD = '%PDF-1.'
key += str_xor(PDF_HEAD, data[:len(PDF_HEAD)])

#### key 7-9
AFTER_FIL = 'ter'
key += str_xor(AFTER_FIL, data[1387:1390])

#### key 10-11
AFTER_LENG = 'th'
key += str_xor(AFTER_LENG, data[8470:8472])

#### key 12-15
AFTER_CAT = 'alog'
key += str_xor(AFTER_CAT, data[672:676])

#### key 16-19
AFTER_MIDI = 'aBox'
key += str_xor(AFTER_MIDI, data[856:860])

#### key 20-22
AFTER_FLATEDEC = 'ode'
key += str_xor(AFTER_FLATEDEC, data[10220:10223])

#### key 23-24
AFTER_PARE = 'nt'
key += str_xor(AFTER_PARE, data[10043:10045])

#### key 25-27
AFTER_IM = 'age'
key += str_xor(AFTER_IM, data[9625:9628])

#### key 28-30
AFTER_LEN = 'gth'
key += str_xor(AFTER_LEN, data[1408:1411])

#### key 31-32
AFTER_FILT = 'er'
key += str_xor(AFTER_FILT, data[10531:10533])

#### key 33-34
AFTER_TY = 'pe'
key += str_xor(AFTER_TY, data[10173:10175])

#### key 35-43
AFTER_FL = 'ateDecode'
key += str_xor(AFTER_FL, data[9695:9704])

#### key 44-45
EOF_TAIL = 'OF'
key += str_xor(EOF_TAIL, data[10784:10786])

#### key 46-50
AFTER_FLATEDECODE_L = 'ength'
key += str_xor(AFTER_FLATEDECODE_L, data[1066:1071])

#### key 51-56
AFTER_EXT = 'GState'
key += str_xor(AFTER_EXT, data[10071:10077])

#### key 57-59
AFTER_RESO = 'urc'
key += str_xor(AFTER_RESO, data[897:900])

print '[+] key:', key

pdf = ''
for i in range(0, len(data), 60):
    dec = str_xor(data[i:i+60], key)
    print dec, i # for arrangement
    pdf += dec

with open('FlagDCTF.pdf', 'wb') as f:
    f.write(pdf)

復号したPDFは3ページにわたり、フラグが書かれている。
f:id:satou-y:20180926193052p:plain
f:id:satou-y:20180926193104p:plain
f:id:satou-y:20180926193113p:plain

DCTF{d915b5e076215c3efb92e5844ac20d0620d19b15d427e207fae6a3b894f91333}

CSAW CTF Qualification Round 2018 Writeup

この大会は2018/9/15 5:00(JST)~2018/9/17 5:00(JST)に開催されました。
今回もチームで参戦。結果は 1001点で671チーム中202位でした。
自分で解けた問題をWriteupとして書いておきます。

Twitch Plays Test Flag (Misc 1)

問題にフラグが書いてあった。

flag{typ3_y3s_to_c0nt1nue}

babycrypto (Crypto 50)

Base64デコードしてXORで復号する。XORの鍵は1文字前提でブルートフォースでやってみる。

def is_printable(s):
    for i in range(len(s)):
        if ord(s[i]) < 32 or ord(s[i]) > 126:
            return False
    return True

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

data = data.decode('base64')

for k in range(256):
    dec = ''
    for i in range(len(data)):
        dec += chr(ord(data[i]) ^ k)
    if is_printable(dec):
        print 'key =', k
        print 'flag =', dec

実行結果は以下の通り。

key = 224
flag = Szpq?vl?~?ompxm~rrzm?hwp?~lovmzl?kp?|mz~kz?ompxm~rl?kw~k?wzso?ozposz?{p?szll1?Wz?h~qkl?kp?ojk?~jkpr~kvpq?yvmlk3?~q{?l|~s~}vsvkf?~spqxlv{z1?Wz?{mz~rl?py?~?hpms{?hwzmz?kwz?zq{szll?~q{?kwz?vqyvqvkz?}z|prz?mz~svkvzl?kp?r~qtvq{3?~q{?hwzmz?kwz?kmjz?i~sjz?py?svyz?vl?omzlzmiz{1ys~xd{vyyvz2wzssr~q2x/ow,mem~PF.U~s+|W~YF&LHMf^N)~Wb
key = 234
flag = Ypz{5|f5t5egzrgtxxpg5b}z5tfe|gpf5az5vgptap5egzrgtxf5a}ta5}pye5epzeyp5qz5ypff;5]p5bt{af5az5e`a5t`azxta|z{5s|gfa95t{q5fvtytw|y|al5tyz{rf|qp;5]p5qgptxf5zs5t5bzgyq5b}pgp5a}p5p{qypff5t{q5a}p5|{s|{|ap5wpvzxp5gpty|a|pf5az5xt{~|{q95t{q5b}pgp5a}p5ag`p5cty`p5zs5y|sp5|f5egpfpgcpq;sytrnq|ss|p8}pyyxt{8r%e}&gogtZL$_ty!v]tSL,FBGlTD#t]h
key = 241
flag = Bka`.g}.o.~|ai|occk|.yfa.o}~g|k}.za.m|kozk.~|ai|oc}.zfoz.fkb~.~ka~bk.ja.bk}} .Fk.yo`z}.za.~{z.o{zacozga`.hg|}z".o`j.}mobolgbgzw.oba`i}gjk .Fk.j|koc}.ah.o.ya|bj.yfk|k.zfk.k`jbk}}.o`j.zfk.g`hg`gzk.lkmack.|kobgzgk}.za.co`eg`j".o`j.yfk|k.zfk.z|{k.xob{k.ah.bghk.g}.~|k}k|xkj hboiujghhgk#fkbbco`#i>~f=|t|oAW?Dob:mFoHW7]Y\wO_8oFs
key = 248
flag = Kbhi'nt'f'wuh`ufjjbu'poh'ftwnubt'sh'dubfsb'wuh`ufjt'sofs'obkw'wbhwkb'ch'kbtt)'Ob'pfist'sh'wrs'frshjfsnhi'anuts+'fic'tdfkfenkns~'fkhi`tncb)'Ob'cubfjt'ha'f'phukc'pobub'sob'bickbtt'fic'sob'nianinsb'ebdhjb'ubfknsnbt'sh'jfilnic+'fic'pobub'sob'surb'qfkrb'ha'knab'nt'wubtbuqbc)akf`|cnaanb*obkkjfi*`7wo4u}ufH^6Mfk3dOfA^>TPU~FV1fOz
key = 252
flag = Oflm#jp#b#sqldqbnnfq#tkl#bpsjqfp#wl#`qfbwf#sqldqbnp#wkbw#kfos#sflsof#gl#ofpp-#Kf#tbmwp#wl#svw#bvwlnbwjlm#ejqpw/#bmg#p`bobajojwz#bolmdpjgf-#Kf#gqfbnp#le#b#tlqog#tkfqf#wkf#fmgofpp#bmg#wkf#jmejmjwf#af`lnf#qfbojwjfp#wl#nbmhjmg/#bmg#tkfqf#wkf#wqvf#ubovf#le#ojef#jp#sqfpfqufg-eobdxgjeejf.kfoonbm.d3sk0qyqbLZ2Ibo7`KbEZ:PTQzBR5bK~
key = 254
flag = Mdno!hr!`!qsnfs`llds!vin!`rqhsdr!un!bsd`ud!qsnfs`lr!ui`u!idmq!qdnqmd!en!mdrr/!Id!v`our!un!qtu!`tunl`uhno!ghsru-!`oe!rb`m`chmhux!`mnofrhed/!Id!esd`lr!ng!`!vnsme!vidsd!uid!doemdrr!`oe!uid!hoghohud!cdbnld!sd`mhuhdr!un!l`ojhoe-!`oe!vidsd!uid!ustd!w`mtd!ng!mhgd!hr!qsdrdswde/gm`fzehgghd,idmml`o,f1qi2s{s`NX0K`m5bI`GX8RVSx@P7`I|
key = 255
flag = Leon is a programmer who aspires to create programs that help people do less. He wants to put automation first, and scalability alongside. He dreams of a world where the endless and the infinite become realities to mankind, and where the true value of life is preserved.flag{diffie-hellman-g0ph3rzraOY1Jal4cHaFY9SWRyAQ6aH}
flag{diffie-hellman-g0ph3rzraOY1Jal4cHaFY9SWRyAQ6aH}

flatcrypt (Crypto 100)

CRIME: Compression Ratio Info-leak Made Easyに関する攻撃が可能。zlib(deflate圧縮)は同じ文字列が繰り返しあると、圧縮率が高くなるという性質を使って、少しずつ文字列を試し、圧縮率の高い文字を探る。

import socket
import string

def recvuntil(s, tail):
    data = ''
    while True:
        if tail in data:
            return data
        data += s.recv(1)

chars = string.lowercase + '_'

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('crypto.chal.csaw.io', 8043))

flag = ''
while True:
    min_length = 9999
    min_char = '?'
    min_char_count = 0
    for c in chars:
        data = recvuntil(s, '\n')
        print data
        f = (c + flag) * 7
        if len(f) < 20:
            f = f * 3
        print f
        s.sendall(f + '\n')
        data = recvuntil(s, '\n')
        print data
        size = ord(data.strip()[-1])
        print size
        if size < min_length:
            min_length = size
            min_char = c
            min_char_count = 1
        elif size == min_length:
            min_char_count += 1
    if min_char_count > 1:
        break
    flag = min_char + flag

print flag

実行結果は以下の通りだが、フラグとしては通らない。

rime_doesnt_have_a_logo

CRIMEの攻撃のことを考え、以下のようにしたら通った。

crime_doesnt_have_a_logo

lowe (Crypto 200)

$ openssl rsa -pubin -text < pubkey.pem
Public-Key: (1536 bit)
Modulus:
    00:cf:70:7e:ed:97:90:17:b7:f6:f4:76:ff:3b:a6:
    55:59:ad:b1:82:e0:7c:fa:23:33:b1:ec:05:6b:7f:
    7b:96:12:40:54:f1:f5:74:8b:04:c3:69:4e:90:f0:
    d9:9f:ee:05:84:a8:7a:70:81:75:80:d4:93:93:32:
    1b:b2:08:07:ff:de:25:a4:c8:ab:d4:6d:95:c1:e3:
    74:0d:9e:64:1f:e7:7f:9b:96:ce:ca:e9:18:e6:7a:
    24:89:52:b5:da:81:ae:77:42:bd:ae:51:b1:29:24:
    59:73:41:50:57:ae:75:df:b7:5a:78:e8:24:37:9e:
    52:50:65:92:c3:75:0e:9a:1c:7e:70:1b:ee:8d:df:
    c7:a9:ca:72:53:4c:d3:b0:95:79:f8:7a:4e:b3:76:
    f9:26:7c:d1:a1:6e:1e:57:90:95:c5:b8:6f:4b:8f:
    24:fb:61:3f:08:a7:e0:e4:75:d2:55:56:ae:41:c8:
    ce:e2:48:e9:0d:ac:96:5d:c4:7d:db:b4:c5
Exponent: 3 (0x3)
writing RSA key
-----BEGIN PUBLIC KEY-----
MIHdMA0GCSqGSIb3DQEBAQUAA4HLADCBxwKBwQDPcH7tl5AXt/b0dv87plVZrbGC
4Hz6IzOx7AVrf3uWEkBU8fV0iwTDaU6Q8Nmf7gWEqHpwgXWA1JOTMhuyCAf/3iWk
yKvUbZXB43QNnmQf53+bls7K6RjmeiSJUrXaga53Qr2uUbEpJFlzQVBXrnXft1p4
6CQ3nlJQZZLDdQ6aHH5wG+6N38epynJTTNOwlXn4ek6zdvkmfNGhbh5XkJXFuG9L
jyT7YT8Ip+DkddJVVq5ByM7iSOkNrJZdxH3btMUCAQM=
-----END PUBLIC KEY-----
n = 0x00cf707eed979017b7f6f476ff3ba65559adb182e07cfa2333b1ec056b7f7b96124054f1f5748b04c3694e90f0d99fee0584a87a70817580d49393321bb20807ffde25a4c8abd46d95c1e3740d9e641fe77f9b96cecae918e67a248952b5da81ae7742bdae51b129245973415057ae75dfb75a78e824379e52506592c3750e9a1c7e701bee8ddfc7a9ca72534cd3b09579f87a4eb376f9267cd1a16e1e579095c5b86f4b8f24fb613f08a7e0e475d25556ae41c8cee248e90dac965dc47ddbb4c5
e = 3

eは小さいので、そのまま3乗根を出そうとしたが、うまくいかない。問題からfile.encはXORで復号できるはず。
この文字列より短い鍵であると仮定すると、3乗してもnを少し超える程度と予想できる。nをプラスしながら、復号する。鍵を復号で来たら、XORでフラグを復号する。

from Crypto.PublicKey import RSA
import gmpy

with open('pubkey.pem', 'r') as f:
    pub_data = f.read()

pubkey = RSA.importKey(pub_data)
n = pubkey.n
e = pubkey.e

with open('key.enc', 'r') as f:
    c = int(f.read().strip())

while True:
    m = gmpy.root(c, e)[0]
    if m**e == c:
        break
    c += n

key = '%x' % m
if len(key) % 2 == 1:
    key = '0' + key
key = key.decode('hex')

with open('file.enc', 'r') as f:
    data = f.read().strip().decode('base64')

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

Trend Micro CTF 2018 - Raimund Genes Cup - Online Qualifier Writeup

この大会は2018/9/15 13:00(JST)~2018/9/16 13:00(JST)に開催されました。
今回もチームで参戦。結果は 3000点で165チーム中21位でした。
自分で解けた問題をWriteupとして書いておきます。

Analysis-Offensive 300

Alice, Bob, CyrilのメッセージがRSA暗号で暗号化されている。
eはすべて65537。Nはすべて異なる。お互いの組、3組について、公約数を求めてみる。
1以外になったので、素因数分解できた。あとはそのまま復号する。

from Crypto.Util.number import inverse

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)
    d = inverse(e, phi)
    m = pow(c, d, n)
    return m

N1 = 23795719145225386804055015945976331504878851440464956768596487167710701468817080174616923533397144140667518414516928416724767417895751634838329442802874972281385084714429143592029962130216053890866347

N2 = 46914096084767238967814493997294740286838053572386502727910903794939283633197997427383196569296188299557978279732421725469482678512672280108542428152186999218210536447287087212703368704976239539968977

N3 = 24543003393712692769038137223030855401835344295968717177380639898023646407807465197761211529143336105057325706788229129519925129413109571220297378014990693203802558792781281981621549760273376606206491

p1, _, _ = egcd(N1, N2)
p2, _, _ = egcd(N2, N3)
p3, _, _ = egcd(N1, N3)

assert p1 * p3 == N1
assert p1 * p2 == N2
assert p2 * p3 == N3

e = 65537

#### decrypt message for Alice
c1 = 18700320110367574655449823553009212724937318442101140581378358928204994827498139841897479168675123789374462637095265564472109735802305521045676412446455683615469865332270051569768255072111079626023422

m1 = decrypt(p1, p3, e, c1)
msg1 = ('%x' % m1).decode('hex')
print msg1

#### decrypt message for Bob
c2 = 27979368157170890767030069060194038526134599497456846620984054211906413024410400026053694007247773572972357106574636186987337336771777265971389911503143036021889778839064900818858188026318442675667707

m2 = decrypt(p1, p2, e, c2)
msg2 = ('%x' % m2).decode('hex')
print msg2

#### decrypt message for Cyril
c3 = 24084879450015204136831744759734371350696278325227327049743434712309456808867398488915798176282769616955247276506807739249439515225213919008982824219656080794207250454008942016125074768497986930713993

m3 = decrypt(p2, p3, e, c3)
msg3 = ('%x' % m3).decode('hex')
print msg3

実行結果は以下の通りで、Bobのメッセージにフラグが含まれていた。

Hi Alice, party is tommorow at 8
Hi Bob, remember, that the flag is TMCTF{B3Car3fu11Ab0utTh3K3ys}
Hi Cyril, could you bring beer tommorow?
TMCTF{B3Car3fu11Ab0utTh3K3ys}

Forensics-Crypto1 400

ブロック暗号のFeistel構造の問題。ただf(x)がXOR関数になっているため、簡単に計算できる。

n: ブロック長の半分( = 144)
h: ラウンド数
l: 鍵サイズ( = 288)
M: 平文空間(2n)
C: 暗号空間(2n)
K: 鍵空間(l)

hが1の場合はMの後半とCの前半が同じになるが、この場合同じになっていない。まずhが2の場合を考える。

M = (m0, m1)

m0, m1 -> m1, m2 = m1, m0 ^ (m1 ^ k1)
m1, m2 -> m2, m3 = m2, m1 ^ (m2 ^ k2) = C

m2 = m0 ^ (m1 ^ k1)
m3 = m1 ^ (m2 ^ k2) = m1 ^ (m0 ^ (m1 ^ k1) ^ k2)
   = m0 ^ k1 ^ k2

このことから逆算して復号する。

M = '010000010110111000100000011000010111000001110000011011000110010100100000011000010110111001100100001000000110000101101110001000000110111101110010011000010110111001100111011001010010000001110111011001010110111001110100001000000111010001101111001000000101010001110010011001010110111001100100'
C = '000100100011000101110101001101100110001100110001001110100011110101100000011110010010111000110011001110000000110100100101011111000011000000100001010000100110011100100001011000000111001101110100011011100110000000100000011011010110001001100100001011010110111001100110001010110110110101110001'
SECRET = '000000110000111001011100001000000001100100101100000100100111111000001001000001100000001100001001000100100010011101001010011000010111100100100010010101110100010001000010010101010100010101111111010001000110000001101001011111110111100001100101011000010010001001001011011000100111001001101011'

m0 = int(M[:144], 2)
m1 = int(M[144:], 2)
m2 = int(C[:144], 2)
m3 = int(C[144:], 2)

k1 = m0 ^ m1 ^ m2
k2 = m0 ^ m3 ^ k1

SECRET1 = int(SECRET[:144], 2)
SECRET2 = int(SECRET[144:], 2)

PLAIN1 = SECRET2 ^ k1 ^ k2
PLAIN2 = SECRET1 ^ PLAIN1 ^ k1

flag1 = ('%036x' % PLAIN1).decode('hex')
flag2 = ('%036x' % PLAIN2).decode('hex')
flag = flag1 + flag2
print flag
TMCTF{Feistel-Cipher-Flag-TMCTF2018}

SEC-T CTF Writeup

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

Sanity check (Misc)

https://kiwiirc.com/client/irc.freenode.net:+6667/#sect-ctfにアクセスすると、フラグが表示されていた。

SECT{SECT_CTF_2018}

Matry0ska1 (Crypto)

離散対数問題。普通にsageで解くだけ。

# solve.sage
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('crypto.sect.ctf.rocks', 4444))

data = s.recv(1024)
data += s.recv(1024)
print data

data = data.split('\n')
p = int(data[-4].split(' = ')[1])
g = int(data[-3].split(' = ')[1])
y = int(data[-2].split(' = ')[1])

R = IntegerModRing(p)
x = discrete_log(R(y), R(g))
print x
s.sendall(str(x) + '\n')
data = s.recv(1024)
print data
$ sage solve.sage
sys:1: RuntimeWarning: not adding directory '' to sys.path since everybody can write to it.
Untrusted users could put files in this directory which might then be imported by your Python code. As a general precaution from similar exploits, you should not execute Python code from this directory

    _    
  (("))  --- Gimme exponent pl0x
  /   \ 
 ( (@) ) 
 \__(__/ 


p = 122488473105892538559311426995019720049507640328167439356838797108079051563759027212419257414247
g = 2
g^x = 78188489369980984629648119596447562374779391545438251587456851215272459452777015193195179446022
:
3579341009338541976776530063
SECT{Ru$$ian_D0LLZ_h0lDs_TH3_S3cR3T}
SECT{Ru$$ian_D0LLZ_h0lDs_TH3_S3cR3T}

Shredder (Misc)

FTK Imagerでimgファイルを開き、flag.txtを抽出する。1バイトの鍵のXORで暗号化されているのかもと思い、ブルートフォースで復号する。

with open('flag.txt', 'rb') as f:
    data = f.read()

for key in range(256):
    flag = ''
    for i in range(len(data)):
        flag += chr(ord(data[i]) ^ key)
    print key, flag
SECT{1f_U_574y_r1gh7_wh3r3_U_R,_7h3n_p30pl3_w1ll_3v3n7u4lly_c0m3_70_U}