Inferno CTF 2019 Writeup

この大会は2019/12/27 19:30(JST)~2019/12/28 15:30(JST)に開催されました。
今回もチームで参戦。結果は946点で485チーム中85位でした。
自分で解けた問題をWriteupとして書いておきます。

Discord (Misc)

Discordに入り、#announcementsチャネルのメッセージを見ると、フラグが書いてあった。

infernoCTF{Y0u_sh4ll_R0t_1n_h3ll_n0w}

Color Blind (Misc)

pngが添付されている。RGBをASCIIコードとして文字にし、つなげる。

from PIL import Image

img = Image.open('colorblind.png').convert('RGB')
w, h = img.size

msg = ''
for y in range(0, h):
    for x in range(0, w):
        r, g, b = img.getpixel((x, y))
        msg += chr(r) + chr(g) + chr(b)

print msg

実行結果は以下の通り。

blahblahblah_hello_how_are_you_today_i_hope_you_are_not_doing_this_manually_infernoCTF{h3y_100k_y0u_4r3_n07_h3x_bl1nD_:O}_doing_this_manually_would_be_a_bad_idea_you_shouldnt_do_it_manually_ok
infernoCTF{h3y_100k_y0u_4r3_n07_h3x_bl1nD_:O}

Where did he GO? (Reversing)

処理を見てみると、jai_ram_ji_ki関数もmandir_wahi_banega関数も簡単に言えば逆順にしているだけ。これを元にフラグを求める。

enc = [33,33,116,65,51,114,71,95,115,49,95,103,110,49,77,77,97,82,103,48,114,80,95,48,103]

dec = ''
for e in enc:
    dec += chr(e)

flag = 'infernoCTF{%s}' % dec[::-1]
print flag
infernoCTF{g0_Pr0gRaMM1ng_1s_Gr3At!!}

Really Secure Algorithm Again (Crypto)

factordbでNを素因数分解する。

25693197123978473 = 150758089 * 170426657

あとはそのまま各要素を復号して文字にしたものをつなげればよい。

from Crypto.Util.number import *

e = 65537
N = 25693197123978473
enc_flag = ['0x2135d36aa0c278', '0x3e8f43212dafd7', '0x7a240c1672358', '0x37677cfb281b26', '0x26f90fe5a4bed0', '0xb0e1c482daf4', '0x59c069723a4e4b', '0x8cec977d4159']

p = 150758089
q = 170426657
phi = (p - 1) * (q - 1)
d = inverse(e, phi)

flag = ''
for hex_c in enc_flag:
    c = int(hex_c, 16)
    m = pow(c, d, N)
    flag += long_to_bytes(m)

print flag
infernoCTF{RSA_k3yS_t00_SmAll}

Feedback (Misc)

アンケートに答えたら、フラグが表示された。

infernoCTF{Th4nks_f0r_th3_f33db4ck!!}