この大会は2019/9/7 3:00(JST)~2019/9/9 3:00(JST)に開催されました。
今回もチームで参戦。結果は6011点で450チーム中3位でした。
自分で解けた問題をWriteupとして書いておきます。
Sanity Check (Misc 1)
問題にフラグが書いてあった。
AFFCTF{S4nity_1s_V4nity_!}
DISC ORDer (Misc 10)
よく見たら、タイトルの大文字部分がDISCORDになっている。Discordに入ると、#generalのところにフラグが書いてあった。
AFFCTF{Pr0p3r_C0ms_aR3_4lways_g00d!}
Download me ... (Web 150)
HTMLソースを見る。
Download file:<pre><a href="download.php?file=file1.txt&token=6f2268bd1d3d3ebaabb04d6b5d099425">file1.txt</a><br /><a href="download.php?file=file2.txt&token=e6cb2a3c14431b55aa50c06529eaa21b">file2.txt</a><br /><a href="download.php?file=file3.txt&token=65658fde58ab3c2b6e5132a39fae7cb9">file3.txt</a><br /><a href="download.php?file=flag.txt&token=">flag.txt</a><br />
ダウンロードするにはtokenを正しく指定する必要がありそう。
file1: 6f2268bd1d3d3ebaabb04d6b5d099425 --(md5reverse)--> 753 file2: e6cb2a3c14431b55aa50c06529eaa21b --(md5reverse)--> 952 file3: 65658fde58ab3c2b6e5132a39fae7cb9 --(md5reverse)--> 536
tokenをmd5の逆変換してみると、ファイルサイズと合っている。flag.txtに対して1から順にmd5の値を指定して、リクエストしてみる。
import requests import hashlib url = 'http://165.22.22.11:25632/download.php?file=flag.txt&token=' for size in range(1, 100): token = hashlib.md5(str(size)).hexdigest() r = requests.get(url + token) flag = r.text if flag != 'Invalid token.': print 'size =', size print flag break
AFFCTF{Pr3dic71bl3_t0k3n5_4r3_b4d}
Alan said. (Crypto 100)
Alanという問題のタイトルからエニグマ暗号と推測。問題の暗号は、qrvpc dryqe uyomt nxzin nlxtt vqgyl mptj。
https://cryptii.com/pipes/enigma-machineで、添付の画像をヒントにパラメータを調整する。
画像から推定できるパラメータは以下の通り。
・ROTOR: 123 ・POSITION: ZOO ・RING: PUB
モデルを変えながら、復号結果を見て、少しでも何か意味のありそうなものを見つける。結果、以下の画面の通り試して、フラグとして通った。
AFFCTF{abitofhussingneverdidanyoneanyharm}
Breaking Bad (Crypto 150)
暗号は大文字小文字の繰り返しになっている。原子番号をASCIIコードとして文字にしておけばよさそう。
enc = 'HoRfSbMtInMcLvFlAcAmInMcAmTeErFmInHoLvDbRnMd' atomic = { 'Ho': 67, 'Rf': 104, 'Sb': 51, 'Mt': 109, 'In': 49, 'Mc': 115, 'Lv': 116, 'Fl': 114, 'Ac': 89, 'Am': 95, 'Te': 52, 'Er': 68, 'Fm': 100, 'Db': 105, 'Rn': 86, 'Md': 101 } dec = '' for i in range(0, len(enc), 2): dec += chr(atomic[enc[i:i+2]]) flag = 'AFFCTF{%s}' % dec print flag
AFFCTF{Ch3m1strY_1s_4Dd1CtiVe}
GolanG Heights (Crypto 350)
Go言語の暗号スクリプトを読み解くと、概要は以下の通り。
・factorBigInt: ランダムBigInt ・p = (factorBigInt ** 2) * 4 + (factorBigInt * 3) + 7351 ・q = (factorBigInt ** 2) * 19 + (factorBigInt * 18) + 1379 ・e = 2
n = p * qからfactorBigIntの一元4次方程式とできる。そこからp, qを割り出すことができる。結果両方とも4で割ったときの余りが3になるので、Rabin暗号の復号方法で復号できる。
from sympy import * from Crypto.Util.number import * def egcd(a, b): if a == 0: return b, 0, 1 else: gcd, y, x = egcd(b % a, a) return gcd, x - (b // a) * y, y def is_printable(s): for c in s: if ord(c) < 32 or ord(c) > 126: return False return True n = 825321266319602503456977005474981604870402407335194099572979028339224439122246767155608828548258547874076592811333439775645799852274012447643240804287007452861599291275940862131595970247906775549656137041013432613989092491697319873901497907382123859210758943466373193369020798176192106305153278525778145033 ct = 801050608421922967220624523903721496853411844056321773877598932155971380872263121340024512973182420871402804237809506243995703890886804092449855251892886296340338442367792297266755554172082930224889412735287102163161928535579728998850091020972410977027707699268899998522781790134147981974412918582618345868 var('x') eq = Eq(((x ** 2) * 4 + (x * 3) + 7351) * ((x ** 2) * 19 + (x * 18) + 1379) - n) ans = solve(eq) x = ans[0] p = (x ** 2) * 4 + (x * 3) + 7351 q = (x ** 2) * 19 + (x * 18) + 1379 assert n == p * q assert p % 4 == 3 assert q % 4 == 3 r = pow(ct, long((p+1)/4), long(p)) s = pow(ct, long((q+1)/4), long(q)) gcd, c, d = egcd(p, q) x = (r * d * q + s * c * p) % n y = (r * d * q - s * c * p) % n plains = [x, n - x, y, n - y] for plain in plains: flag = long_to_bytes(plain) if is_printable(flag): flag = 'AFFCTF{%s}' % flag print flag break
AFFCTF{##just!c3_just!c3_y0u_sh@ll_pursu3_##_d3m@nd__p3@c3__@nd__pursu3__!t##}
Epic Poem (Crypto 500)
XOR鍵がAFFCTF{から始まると推定して、復号する。その際片方のメッセージが以下のサイトのものと同じになりそうなので参考にする。
https://pl.wikisource.org/wiki/Litwo,_Ojczyzno_moja!
def str_xor(s1, s2): return ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(s1, s2)) def is_printable(s): for c in s: if ord(c) < 32 or ord(c) > 126: return False return True with open('enc1', 'rb') as f: data1 = f.read() with open('enc2', 'rb') as f: data2 = f.read() flag_head = 'AFFCTF{' for i in range(len(data1) - 7): m1 = str_xor(data1[i:i+7], flag_head) m2 = str_xor(data2[i:i+7], flag_head) if is_printable(m1) and is_printable(m2): print i, '"' + m1 + '"', '"' + m2 + '"' ## guess that key length is 35 pt1_head = 'Litwo! Ojczyzno moja! Ty jestes jak' key = str_xor(pt1_head, data1[:35]) print key
AFFCTF{M4nY_t1m3_PaD_1$_b@d__!!!}
Grains of Sand (Crypto 900)
TLSの通信ばかり。証明書をエクスポートしてみる。2つのセッションで証明書はあるが、まずはNo.6のパケットからエクスポートし、内容を確認する。
$ openssl x509 -in 6.cer -text -pubkey -inform DER Certificate: Data: Version: 1 (0x0) Serial Number: 10166668427322618640 (0x8d174311bfbe7310) Signature Algorithm: sha256WithRSAEncryption Issuer: CN=AFFCTF-2019 Validity Not Before: Aug 6 14:06:46 2019 GMT Not After : Aug 5 14:06:46 2020 GMT Subject: CN=AFFCTF-2019 Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (512 bit) Modulus: 00:ad:74:88:97:ea:99:aa:23:7e:d9:7b:59:ef:f6: 33:58:bf:6d:d9:15:0e:e1:34:e2:80:93:b0:8f:29: a1:60:60:47:18:93:87:70:87:83:a5:00:c1:28:8f: 90:eb:fa:75:5d:f2:ce:c3:1e:c7:e9:12:28:ec:ce: 19:c1:1d:da:43 Exponent: 3 (0x3) Signature Algorithm: sha256WithRSAEncryption a7:18:83:30:e6:6a:a5:d8:36:0e:43:7c:c0:e1:4e:53:67:40: e9:d5:0b:aa:d6:86:03:39:ee:c6:2e:d3:53:cc:dd:07:26:0e: 05:6b:71:02:ff:db:52:cf:a1:52:68:19:d3:22:a3:16:e2:83: 83:5e:57:61:2f:aa:1e:34:61:f2 -----BEGIN PUBLIC KEY----- MFowDQYJKoZIhvcNAQEBBQADSQAwRgJBAK10iJfqmaojftl7We/2M1i/bdkVDuE0 4oCTsI8poWBgRxiTh3CHg6UAwSiPkOv6dV3yzsMex+kSKOzOGcEd2kMCAQM= -----END PUBLIC KEY----- -----BEGIN CERTIFICATE----- MIIBGzCBxgIJAI0XQxG/vnMQMA0GCSqGSIb3DQEBCwUAMBYxFDASBgNVBAMMC0FG RkNURi0yMDE5MB4XDTE5MDgwNjE0MDY0NloXDTIwMDgwNTE0MDY0NlowFjEUMBIG A1UEAwwLQUZGQ1RGLTIwMTkwWjANBgkqhkiG9w0BAQEFAANJADBGAkEArXSIl+qZ qiN+2XtZ7/YzWL9t2RUO4TTigJOwjymhYGBHGJOHcIeDpQDBKI+Q6/p1XfLOwx7H 6RIo7M4ZwR3aQwIBAzANBgkqhkiG9w0BAQsFAANBAKcYgzDmaqXYNg5DfMDhTlNn QOnVC6rWhgM57sYu01PM3QcmDgVrcQL/21LPoVJoGdMioxbig4NeV2Evqh40YfI= -----END CERTIFICATE-----
公開鍵パラメータは以下のようになっている。
n = 0x00ad748897ea99aa237ed97b59eff63358bf6dd9150ee134e28093b08f29a1606047189387708783a500c1288f90ebfa755df2cec31ec7e91228ecce19c11dda43 e = 3
nを素因数分解しようと思ったが、なかなかできない。sand.numというファイルもあったので、試しにnを割ってみると、割り切れることが分かる。
n = 0x00ad748897ea99aa237ed97b59eff63358bf6dd9150ee134e28093b08f29a1606047189387708783a500c1288f90ebfa755df2cec31ec7e91228ecce19c11dda43 num = 95822117903881741755045863839122036726311174271919162702302872031449498584799 assert n1 % num == 0 p = num q = n1 / p assert n1 == p * q print 'p =', p print 'q =', q
実行結果は以下の通り。
p = 95822117903881741755045863839122036726311174271919162702302872031449498584799 q = 94806779941127810821354869084316339665245001669547639965103664836666568035613
これで、p, qがわかり秘密鍵を生成できる。
$ rsatool.py -f PEM -o secret1.pem -p 95822117903881741755045863839122036726311174271919162702302872031449498584799 -q 94806779941127810821354869084316339665245001669547639965103664836666568035613 -e 3 Using (p, q) to initialise RSA instance n = ad748897ea99aa237ed97b59eff63358bf6dd9150ee134e28093b08f29a1606047189387708783a5 00c1288f90ebfa755df2cec31ec7e91228ecce19c11dda43 e = 3 (0x3) d = 73a305ba9c66716cff3ba7914aa4223b2a493b635f40cdec55b7cb0a1bc0eae9c1184bb7b9250a89 0cf3ba3ef29209613c26f77af9ad8b67ecd05efc2ed7aedb p = d3d96593027df3dfaa545650876cd8fc35d46671d4113924bf8ec0be190d06df q = d19abc60d851fff7c2ff3ae09da413674de3f518d4325ed186257ee161cd4d1d Saving PEM as secret1.pem
このファイルをWiresharkで設定して通信を見てみる。この復号した通信の中からパスフレーズ付きの秘密鍵が取れるが、パスフレーズはわからない。あと怪しいLocationのデータがある。
1slbrvzlvbwxda6nrrs6b67u4d6lbn9h4emxkncxnlm0nr6dwn4bz077jo1kkx8tvgx2eucm80ivnck7dosr7nspsi61ytedp6ibathma6tt43bzsi2c754wwpva4b1fgvo17iofuc5zt52utha7h8pgz4pj2hbnz3upy0xenl504auhp4ab8daqajlj4vq9a7to4khh3pilrq0fhseumx875p47p5l6gmmymyf7ezpjmckmbkcil6h58fhxe6289qd3mxf7560k0z5fqvedw7zbtdspttl4e271sxon019spnimqi9h52u7n2et6n01vkoer2vq1grg13xgbcnq71r12ale5oljepn5hhy98lgqfln3vfsxh1qyo72sgpzw0xgyvikq3i2vgpx3hgwdahzqrnvcie5i8den16jj02s7tj453tog53xo529viq0ibsz75qlehrv240qpncvbg2or8quv6u49ngquspwjfvcd776wfu4q2jmap2crsfqgyctl4vq5do0x9m1820mq6fa9ewfgqs08dvfhz2v70kexnz548xlanorujm6uocnznqq962869ga0tsc21jpzmbm0wt9q6y2rrhtq59mknd74aabwm7m6oy05hq7r7t3lzw0uyl8pcai86845ynqfdc1jnizope8p0fskpmr5hnsxum9jf32hb4umrgll25e5ltd0xzrumcbj3ahyxa2r1g6e7syix9wq8q88wvlcvc77lf28a3lplb6q5g4vjlzktj559qv22zjf8a81we7i2gw0lej946mh4si0ldift07gb7vvjf0z2r2zay6aek7k32cwd67drqq8iaqalz021ircoxzr6n5egrpqw6w0lggzp0n4w3jgijxx6im6r477j0v52jo07uc5izipesedd24zcyasdqa5yolt4y4yr0nuwzelmlg9cgm9bjjcp2er35j1hkxtdhyklkk7nqaqvooswh3hh59kno1wggf96puwc6tup743w7b8kmis9ilxh8z390u0822xq3851ionsbse2eackkkh0acxdacjtqrxid8a1belk95o7ges0zu3zr5hx0q6xvx7lhu9f37tfbtk7bczclryuu1pug3ke33w34andbcpfk7r60ifath13us4y7136rzy1le1a7c7nfvmn2uktm4xzyekkhms7fy3qs9kh35ztj7biyy8s8jytqx37mcqokkd3zjr9kmbif8o0hm0m6mexmdzqwn04xxlrof54jo51r43syffha1chik8djb3bzgs9g4o301hi3emyah6hgmazzgqgc57iwyidjtmylvrzlsfz8wor61cq2r67pkkjfz9evzn2i7kqaj07ht7abluxhn8aa373bifobclsz6qqeuybfy08vyojnse0hybr1fe5cnicm7tyvz5o24a8e9x24z2x2vpwqszed1ficdbc43y78gkexgvrau2sf9q34u5d10lk7vwjp89bx5gunxzch0v62qnbjutokgrv7d72ox1cnlfwrpp8lehqvyi9aqgjnanmyj2buynu2sf89huemau0kukbjw831nwppqnlr40lqy5w9fp6bldhv8d4bdcsuw3oz6carp2e7hgk6z6bx7tp468qokhyorwonyfwlkk8suqdx7ywj1foxbmf9xnsr7kh887q9712s32d6lsj4rcx44ya4d8z8ayzrvosmb11sw87j5yyiooxxbul150rgl7kxq3tewyn75t9hxtekfqsf22vja6smpjazfekg0pdqrg1hnb6yoqu045dg8fwqc7ls4zcbf94mwv2hkits9itnntqdo23uc8xcqcovhxr6aw6xvseaoc96p5xsucubgbxkwo8rqfdcb8851fvyl51rkkfpc9jfb8ygryc8sapluhh7uzqqsfx47k4id5lnnayitp0v5emnntc0f730s1yiy3upxb7fflp9m7dmgt7qajaiqq2f3y5ey69bxv43f7cxtlcxbar1agfyei2rpajdb1by5ch6508lo8w66g4qdaj7ilgmepg5p1ck2sek3u3vkde3daolt5y1lq2pyz3ds0436lgucspa4xvj0563z0rxdbd7qn23ftcsf2bmo8nr7go9cffanqfp31kqtluw7zbnuanx4thilmabc18yydjkw4fl9aio76kejkn4qr2wau4egbv5ntb5jc4dupt400k98bluy4whpl5cck4i4pd3v05dr6ifqqo52161g5qe465s4bougpco3qwugfv88vhkhk1gou5fz7noe98ffcxl0b1qjdznvh3rii5ufhj47dxygcnh0a1kud5lysegcbz00mrvl1v6q62yd481wnb0d6ptof29iqjoxnvol6sjtwdhxyy95494jur0dm41yi857spg2qixbmnh51qspp2c8enpd4pb63olmxsktdxt6dp5qfmxrnxi3jfmvu99d44axhe9g5by4vt6y3efu5pwni9rtwvcatekv15xzvrwko0ciu4lnkwxud1qw130z7w2djzyz5mkxmv40q18v95qhhg90pxotp6647y2f1q5bom7xwm94g2ao7akxcfxfhn9whioanavjmb3j2a7inb49aigfy70t0tlpmep3jxyjkydwdckyrdd8io4e0zq9swb4ydv18fkefwuk1ru6q0rovtzkx2rzz2s79n0pf1g4ak2errugcdcc2any7ok2scyqwumygncng5u2tcbyj1zsye98xayk6mjixu2zb5gc9htimpi860n5jx7gzwfed616pgmk1rnsmhl11r2av7190e9j5yn39fe6u4csyz49gl9dtf0299907hc3f4d9hc05n5zmfn82w55tcc3rn11o3jxpd35wxn2mt1gcwhuetwqolvwtg0u70h0sck8q8g1fibwkvh8xh9vc534ixagokrsaq891gwbzvqkpat5xa8engvcuygl73rp639hskqa9oix9p1vgp5ilo2u6bjdxzf96gi9qlcihwvo3uk59ry4mrm8d2fm3nc4mm9f6gvwsq5j7pgx5dhwaa79qu32p9zaaqo9nntsbg8wv6zyae6ehwqbdc6ucv5o4sahbkbqbqo395o0fsrwwowy8tt3fx12ddz4jooqh17f8y1ouq3wo40q4wq958iyc82qcl6tgrdkqrej8h3meyhtdjzq62l91gsakx7z66oa1dfcndc7rkj6q0k3h4w051ohvz87qq5x1fqx87it-w1-s1-v03-p33
この長い文字列の末尾の、"w1-s1-v03-p33"は前にも見たことがあり、Library of Babel(http://libraryofbabel.info/)のものだとわかった。
ここのBrowseのページで以下のデータを順番に指定する。
Hex Name: 1slbrvzlvbwxda6nrrs6b67u4d6lbn9h4emxkncxnlm0nr6dwn4bz077jo1kkx8tvgx2eucm80ivnck7dosr7nspsi61ytedp6ibathma6tt43bzsi2c754wwpva4b1fgvo17iofuc5zt52utha7h8pgz4pj2hbnz3upy0xenl504auhp4ab8daqajlj4vq9a7to4khh3pilrq0fhseumx875p47p5l6gmmymyf7ezpjmckmbkcil6h58fhxe6289qd3mxf7560k0z5fqvedw7zbtdspttl4e271sxon019spnimqi9h52u7n2et6n01vkoer2vq1grg13xgbcnq71r12ale5oljepn5hhy98lgqfln3vfsxh1qyo72sgpzw0xgyvikq3i2vgpx3hgwdahzqrnvcie5i8den16jj02s7tj453tog53xo529viq0ibsz75qlehrv240qpncvbg2or8quv6u49ngquspwjfvcd776wfu4q2jmap2crsfqgyctl4vq5do0x9m1820mq6fa9ewfgqs08dvfhz2v70kexnz548xlanorujm6uocnznqq962869ga0tsc21jpzmbm0wt9q6y2rrhtq59mknd74aabwm7m6oy05hq7r7t3lzw0uyl8pcai86845ynqfdc1jnizope8p0fskpmr5hnsxum9jf32hb4umrgll25e5ltd0xzrumcbj3ahyxa2r1g6e7syix9wq8q88wvlcvc77lf28a3lplb6q5g4vjlzktj559qv22zjf8a81we7i2gw0lej946mh4si0ldift07gb7vvjf0z2r2zay6aek7k32cwd67drqq8iaqalz021ircoxzr6n5egrpqw6w0lggzp0n4w3jgijxx6im6r477j0v52jo07uc5izipesedd24zcyasdqa5yolt4y4yr0nuwzelmlg9cgm9bjjcp2er35j1hkxtdhyklkk7nqaqvooswh3hh59kno1wggf96puwc6tup743w7b8kmis9ilxh8z390u0822xq3851ionsbse2eackkkh0acxdacjtqrxid8a1belk95o7ges0zu3zr5hx0q6xvx7lhu9f37tfbtk7bczclryuu1pug3ke33w34andbcpfk7r60ifath13us4y7136rzy1le1a7c7nfvmn2uktm4xzyekkhms7fy3qs9kh35ztj7biyy8s8jytqx37mcqokkd3zjr9kmbif8o0hm0m6mexmdzqwn04xxlrof54jo51r43syffha1chik8djb3bzgs9g4o301hi3emyah6hgmazzgqgc57iwyidjtmylvrzlsfz8wor61cq2r67pkkjfz9evzn2i7kqaj07ht7abluxhn8aa373bifobclsz6qqeuybfy08vyojnse0hybr1fe5cnicm7tyvz5o24a8e9x24z2x2vpwqszed1ficdbc43y78gkexgvrau2sf9q34u5d10lk7vwjp89bx5gunxzch0v62qnbjutokgrv7d72ox1cnlfwrpp8lehqvyi9aqgjnanmyj2buynu2sf89huemau0kukbjw831nwppqnlr40lqy5w9fp6bldhv8d4bdcsuw3oz6carp2e7hgk6z6bx7tp468qokhyorwonyfwlkk8suqdx7ywj1foxbmf9xnsr7kh887q9712s32d6lsj4rcx44ya4d8z8ayzrvosmb11sw87j5yyiooxxbul150rgl7kxq3tewyn75t9hxtekfqsf22vja6smpjazfekg0pdqrg1hnb6yoqu045dg8fwqc7ls4zcbf94mwv2hkits9itnntqdo23uc8xcqcovhxr6aw6xvseaoc96p5xsucubgbxkwo8rqfdcb8851fvyl51rkkfpc9jfb8ygryc8sapluhh7uzqqsfx47k4id5lnnayitp0v5emnntc0f730s1yiy3upxb7fflp9m7dmgt7qajaiqq2f3y5ey69bxv43f7cxtlcxbar1agfyei2rpajdb1by5ch6508lo8w66g4qdaj7ilgmepg5p1ck2sek3u3vkde3daolt5y1lq2pyz3ds0436lgucspa4xvj0563z0rxdbd7qn23ftcsf2bmo8nr7go9cffanqfp31kqtluw7zbnuanx4thilmabc18yydjkw4fl9aio76kejkn4qr2wau4egbv5ntb5jc4dupt400k98bluy4whpl5cck4i4pd3v05dr6ifqqo52161g5qe465s4bougpco3qwugfv88vhkhk1gou5fz7noe98ffcxl0b1qjdznvh3rii5ufhj47dxygcnh0a1kud5lysegcbz00mrvl1v6q62yd481wnb0d6ptof29iqjoxnvol6sjtwdhxyy95494jur0dm41yi857spg2qixbmnh51qspp2c8enpd4pb63olmxsktdxt6dp5qfmxrnxi3jfmvu99d44axhe9g5by4vt6y3efu5pwni9rtwvcatekv15xzvrwko0ciu4lnkwxud1qw130z7w2djzyz5mkxmv40q18v95qhhg90pxotp6647y2f1q5bom7xwm94g2ao7akxcfxfhn9whioanavjmb3j2a7inb49aigfy70t0tlpmep3jxyjkydwdckyrdd8io4e0zq9swb4ydv18fkefwuk1ru6q0rovtzkx2rzz2s79n0pf1g4ak2errugcdcc2any7ok2scyqwumygncng5u2tcbyj1zsye98xayk6mjixu2zb5gc9htimpi860n5jx7gzwfed616pgmk1rnsmhl11r2av7190e9j5yn39fe6u4csyz49gl9dtf0299907hc3f4d9hc05n5zmfn82w55tcc3rn11o3jxpd35wxn2mt1gcwhuetwqolvwtg0u70h0sck8q8g1fibwkvh8xh9vc534ixagokrsaq891gwbzvqkpat5xa8engvcuygl73rp639hskqa9oix9p1vgp5ilo2u6bjdxzf96gi9qlcihwvo3uk59ry4mrm8d2fm3nc4mm9f6gvwsq5j7pgx5dhwaa79qu32p9zaaqo9nntsbg8wv6zyae6ehwqbdc6ucv5o4sahbkbqbqo395o0fsrwwowy8tt3fx12ddz4jooqh17f8y1ouq3wo40q4wq958iyc82qcl6tgrdkqrej8h3meyhtdjzq62l91gsakx7z66oa1dfcndc7rkj6q0k3h4w051ohvz87qq5x1fqx87it Wall: 1 Shelf: 1 Volume: 3 Page: 33
すると、この長い文章の中に以下の情報を見つけた。
password is periodicandselfrepeating
$ openssl rsa -in secret2.pem -out secret2_without_pass.pem Enter pass phrase for secret2.pem: writing RSA key
このファイルをWiresharkで設定して通信を見てみる。/flagをGETしているのでそのレスポンスを見ると、フラグが書いてあった。
AFFCTF{73H_liBr4Ry_0F_B4b3l_!!}