Mariydiが解けたものだけ記載しています。
書いてないものは解けてないやつ。
Web
catch me if you can!
WebサイトにアクセスしてF12押して、見たら終わり。
Flag:
actf{y0u_caught_m3!_0101ff9abc2a724814dfd1c85c766afc7fbd88d2cdf747d8d9ddbf12d68ff874}
shortcircuit
とりあえずF12を押すと、30文字1セットにして並べ替えてるのがわかる。
こういう並べ替えは、紙で書くほうがわかりやすくていいよね。。。
あとはページ下部に書いてるフラッグっぽいものを持ってきて区切って並べ替える。
7e08250c4aaa9ed206fd7c9e398e2}actf{cl1ent_s1de_sucks_544e67ef12024523398ee02fe7517fffa92516317199e454f4d2bdb04d9e419ccc7
3: 7e08250c4aaa9ed206fd7c9e398e2}
0: actf{cl1ent_s1de_sucks_544e67e
2: f12024523398ee02fe7517fffa9251
1: 6317199e454f4d2bdb04d9e419ccc7
Flag:
actf{cl1ent_s1de_sucks_544e67e6317199e454f4d2bdb04d9e419ccc7f12024523398ee02fe7517fffa92517e08250c4aaa9ed206fd7c9e398e2}
directory
page0~4999まである。どこかにフラグがあると思うので、Pythonで全部なめる。ちゃんとアクセスしてるか心配だったから100ごとに出力させてる。
こういうちょっとしたプログラムを組むのは早くなったなって思う。
import requests
# source site(0.html)
url = 'https://directory.web.actf.co/'
# get data
def data_get():
print('Data Getting......')
# send request to source url.
for i in range(5000):
res = requests.get(url+str(i)+'.html')
if res.text != 'your flag is in another file':
print(res.text)
if i%100 == 0:
print(i)
if __name__=='__main__':
response = data_get()
Flag:
actf{y0u_f0und_me_b51d0cde76739fa3}
Crypto
ranch
シーザー暗号。くるくる回して9文字目で読めるようになったからそれ。
Flag:
actf{lo0ks_like_we'll_h4ve_to_try_an0ther_dress1ng_5ef89b3a44901831}
Royal Society of Arts
RSA暗号の基礎問題。っていってもまだ基礎問題しか解けない。
n,e,cの他にpとqに関する式が与えられていたので、なんとかpかqだけにできないかな~ってごちゃごちゃしてた。昼飯から帰ってきたところでひらめいた。GG。
from Crypto.Util.number import long_to_bytes
n = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230158509195522123739130077725744091649212709410268449632822394998403777113982287135909401792915941770405800840172214125677106752311001755849804716850482011237
e = 65537
c = 40544832072726879770661606103417010618988078158535064967318135325645800905492733782556836821807067038917156891878646364780739241157067824416245546374568847937204678288252116089080688173934638564031950544806463980467254757125934359394683198190255474629179266277601987023393543376811412693043039558487983367289
p2q1 = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230125943565148141498300205893475242956903188936949934637477735897301870046234768439825644866543391610507164360506843171701976641285249754264159339017466738250
p1q2 = 125152237161980107859596658891851084232065907177682165993300073587653109353529564397637482758441209445085460664497151026134819384539887509146955251284230123577760657520479879758538312798938234126141096433998438004751495264208294710150161381066757910797946636886901614307738041629014360829994204066455759806614
tmp = p2q1 - p1q2
## (pq-p-2q+2) - (pq-2p-q+2) = p-q
#
# (p-1)*(q-1) = pq-p-q+1
# = n -(p+q) +1 ->まだ無理そう
# (p-1)*(q+1) = pq +p-q -1
# = n +p-q -1 ->導出できる!
a = n + tmp -1
# (p-1)*(q+1) - (p-1)*(q-2) = (pq +p-q -1) - (pq-2p-q+2)
# = 3p-3 -> pが導出できそう!
p = (a - p1q2 +3 ) //3
q = n//p
## p GET!!!
#よく、Pythonの整数除算の特徴を忘れる。
# ここまできたらあとはkurenif先生に教えてもらったとおりよ!
phi = (p-1) * (q-1)
d = pow(e,-1,phi)
# d GET!!!
m = pow(c,d,n)
print(long_to_bytes(m))
Flag:
actf{tw0_equ4ti0ns_in_tw0_unkn0wns_d62507431b7e7087}
Rev
checkers
もらったファイルをなんとなーくstringsで見る。こういう、なんとなくこれかなってのはガチ一番最初にWriteUp見たとき意味分かんなかったけど、経験値なんだなって最近知る。
Flag:
actf{ive_be3n_checkm4ted_21d1b2cebabf983f}
Misc
meow
問題文にあるからそのまま打つだけ。
sanity check
Discordのチャンネルに書かれてる。
Admiral Shark
pcapファイルが配られる。
中身を見ていると、rawがどうのこうのって言い出したので、rawでなにかするのかな~と推測。
中身見てたらいきなり送るやでって言い出したから、その後のTCPストリームの中で一番でかいパケットをraw形式で保存
何のファイルかわからなかったのでLinuxで確認。どうやらZipアーカイブファイルらしい。
このままunzipで開いちゃえって思ったけどなんか開けなかった。これなんでだろ。いろいろ調べてると、7zなら開けるんじゃね?って記事があったので、やってみると展開できた。
中身のファイルを確認していくと、無事に発見できた。
Flag:
actf{wireshark_in_space}