i3CTF writeup
i3CTFに参加し、何とか10位となりました。
ということで、解けたものをWriteup書いていこうと思います。
Misc
[Misc]welcome
やるだけ
[Misc]Word?
officeのファイルでdocxとか x の付くファイルはzip圧縮されたファイルなので、
拡張子zipに変えると解凍できます。ということで解凍して中の
[Content_Types].xmlを見てみると、フラグがありました。
FLAG{Word_is_zip}
[Misc]QR
うさみみハリケーン付属のツールでいろいろ試してみると…
いい感じに邪魔なデータを除去してくれるものが。
あとはネットのQRコード読み取りサイトを使わせてもらいました。
FLAG{Error_correction_30_percent}
[Misc]music
Dominoというツールでmidiファイル開いてみると、譜面で文字が。
FLAG{MIDI_IS_NOT_WAVE}
[Misc]Icon
Word?と同じようにpptxファイルをzip解凍。中をのぞいていっていると
thumbnail.jpegというファイルにフラグが書かれていた。
FLAG{How_did_you_find_it?}
[Misc]crack
ここからなかなか難しかった。暗号化zipファイル、
さらに問題文で"password easy"といってることからパスワード総当たりすればいけそうである。
johntheripperを利用し以下実行してみる。なおrockyou.txtをダウンロードしておく必要アリ。
zip2john.exe crack.zip > crack.hash
john.exe --pot=tmp.pot --wordlist=rockyou.txt crack.hash
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password1122 (crack.zip/important.txt)
1g 0:00:00:00 DONE (2025-01-01 19:43) 4.255g/s 5995Kp/s 5995Kc/s 5995KC/s pink621..parlee
Use the "--show" option to display all of the cracked passwords reliably
Session completed
ということでパスワードは"password1122"であった。
crack.zipを回答して出てくるimportant.txtにフラッグが書かれている。
FLAG{F1r57_P455w0rd_Cr4ck}
[Misc]font
これはだいぶ難しかった・・・image.pngをgoogle画像検索すると、どうも
これは wingdings というfontで書かれた何かという想像がついたので、読んでみる。
いいツールがなく自力で目grep・・・ということで読んだ結果は
となった。このツールで画像を解析してみると何か埋め込まれているようだがパスワードがかかっている。
ということで画像をexiftoolで見てみると…
ExifTool Version Number : 13.10
File Name : image.png
Directory : C:/Users/kaiinaba/Desktop/Study/セキュリティ/i3ctf/misc/font
Warning : FileName encoding must be specified [x2]
File Size : 56 kB
Zone Identifier : Exists
File Modification Date/Time : 2024:12:24 20:29:21+09:00
File Access Date/Time : 2025:01:01 19:49:57+09:00
File Creation Date/Time : 2024:11:25 23:40:32+09:00
File Permissions : -rw-rw-rw-
File Type : PNG
File Type Extension : png
MIME Type : image/png
Image Width : 1091
Image Height : 702
Bit Depth : 8
Color Type : Palette
Compression : Deflate/Inflate
Filter : Adaptive
Interlace : Noninterlaced
SRGB Rendering : Perceptual
Gamma : 2.2
Palette : (Binary data 768 bytes, use -b option to extract)
Pixels Per Unit X : 2835
Pixels Per Unit Y : 2835
Pixel Units : meters
About : uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b
Creator : xn--v9j2hwb4a4l2c
Rights : bnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgaW1hZ2U=
Image Size : 1091x702
Megapixels : 0.766
と、ある。
Creator : xn--v9j2hwb4a4l2c
Rights : bnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgaW1hZ2U=
の部分が怪しい…Creatorはpunycodeで"パスワードは"となり、
Rightsはbase64で"number of pixels in the image"となった。
ということはパスワードは 1091 * 702 で 765882 ということか。
これでファイル抽出してみたところうまくいった。
FLAG{S7e9an0Gr@pHy}
[Misc] rAndoMTexT
chatgpt o1さまさまで、聞いてみたところ、小文字0大文字1に変換して解読すればいけた。
FLAG{8yn@ry_nUm6eR}
であった。
OSINT
[OSINT] Island
第一問ということで画像に位置情報が埋め込まれてました。
坂井市の島とやらは雄島だそうで、
FLAG{Oshima}でした。
[OSINT] Gyukaku
牛角、4Fにあるのはわかる・・・ということで牛角の店舗検索をしてみると13件。
人力で一つずつ調べてみる…
すると牛角 吉祥寺北口店でビンゴな情報を発見。
FLAG{BIGECHO}でした。
[OSINT] Photographer
ExifToolでチェック。
ExifTool Version Number : 13.10
File Name : beautiful.jpg
Directory : C:/Users/kaiinaba/Desktop/Study/セキュリティ/i3ctf/osint/photographer
Warning : FileName encoding must be specified [x2]
File Size : 978 kB
Zone Identifier : Exists
File Modification Date/Time : 2024:12:26 19:09:46+09:00
File Access Date/Time : 2025:01:02 11:11:38+09:00
File Creation Date/Time : 2024:11:08 11:00:40+09:00
File Permissions : -rw-rw-rw-
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
Exif Byte Order : Big-endian (Motorola, MM)
Orientation : Horizontal (normal)
Artist : promise_heavily_amongst
Copyright : promise_heavily_amongst
XP Author : promise_heavily_amongst
Padding : (Binary data 268 bytes, use -b option to extract)
Profile CMM Type : Apple Computer Inc.
Profile Version : 4.0.0
Profile Class : Display Device Profile
Color Space Data : RGB
Profile Connection Space : XYZ
Profile Date Time : 2022:01:01 00:00:00
Profile File Signature : acsp
Primary Platform : Apple Computer Inc.
CMM Flags : Not Embedded, Independent
Device Manufacturer : Apple Computer Inc.
Device Model :
Device Attributes : Reflective, Glossy, Positive, Color
Rendering Intent : Perceptual
Connection Space Illuminant : 0.9642 1 0.82491
Profile Creator : Apple Computer Inc.
Profile ID : ecfda38e388547c36db4bd4f7ada182f
Profile Description : Display P3
Profile Copyright : Copyright Apple Inc., 2022
Media White Point : 0.96419 1 0.82489
Red Matrix Column : 0.51512 0.2412 -0.00105
Green Matrix Column : 0.29198 0.69225 0.04189
Blue Matrix Column : 0.1571 0.06657 0.78407
Red Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract)
Chromatic Adaptation : 1.04788 0.02292 -0.0502 0.02959 0.99048 -0.01706 -0.00923 0.01508 0.75168
Blue Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract)
Green Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract)
HDR Gain Curve : (Binary data 1258 bytes, use -b option to extract)
About : uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b
Creator : promise_heavily_amongst
Rights : promise_heavily_amongst
Image Width : 4032
Image Height : 3024
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
Image Size : 4032x3024
Megapixels : 12.2
promise_heavily_amongst とやらをググってもいい情報なし。
FLAG{f0und_th3_ph0t0gr4ph3r}
ちなみに画像の場所は大雪山層雲峡・黒岳ロープウェイだそう。
こういう画像見るといってみたくなりますね。
[OSINT] fuda
この問題、Photographerより先に解けました。
googleレンズで検索してもヒットしないものの、
テキストを選択、としてみると
「仁王 を見開 右側の で口を 優高30 と左右 鎌倉期 阿形 造形に 平成 指定さ」
とでる。"優高"は誤判別であろうので、像高とし
「仁王 を見開 右側の で口を 像高30 と左右 鎌倉期 阿形 造形に 平成 指定さ」
で検索すると、以下の結果。
この三つ目のサイトから"明眼院 みょうげんいん"とわかった...が英語でどう書くんだ?
いろいろためしてみたところ
FLAG{MYOGENIN}であった。
Crypto
[Crypto] Julius
問題名、問題からしてシーザー暗号・・・ということでdCodeを試してみる。
「Gaius Julius Caesar was a Roman general and statesman. A member of the First Triumvirate, Caesar led the Roman armies in the Gallic Wars before defeating his political rival Pompey in a civil war, and subsequently became dictator from 49 BC until his assassination in 44 BC. FLAG is EifgQJDKJPmCYtJ」
と出る。
FLAG{EifgQJDKJPmCYtJ}
[Crypto] XOR
ここからが本番ですね。
#chall.py
import random
import string
import hashlib
from Crypto.Util.number import bytes_to_long,long_to_bytes
flag = b'kore_ha_dummy_desu_anata_ha_tadori_tuku_beki_da_FLAG{dummy}'
key = random.choice(string.printable.strip()).encode()
hash = hashlib.blake2b(flag).hexdigest()
enc = b''
for i in range(len(flag)):
a = flag[i] ^ bytes_to_long(key)
enc += long_to_bytes(a)
print(f'enc = {enc}')
print(f'hash = {hash}')
keyは表示可能な1文字で、flag各文字に対しそれぞれkeyでxorしたものを出力指定している。
ということでブルートフォース可能。
#solver.py
import random
import string
import hashlib
from Crypto.Util.number import bytes_to_long,long_to_bytes
enc = b'\x12\x16\x0b\x1c&\x11\x18&\x1f\x15\x18\x1e&\x1d\x1c\n\x0c&\x18\x17\x18\r\x18&\x11\x18&\r\x18\x1d\x16\x0b\x10&\r\x0c\x10\r\x18&\x17\x16&\x1d\x18&?58>\x02\x03J\x1b\x0bM\n&\x18\x0bJ&\x18\x15\nI&\x01I\x0b\x04'
hash = "50806af7b4cb65abe94969ce3a3f8792d8205bb250b12117e56dcd79b048205aa74d7087ed1984e8a8d071ce9606f9e56e9cd1a5ebd19057a47d49a3c2ee291b"
for key in string.printable.strip().encode():
flag = b''
for i in range(len(enc)):
a = enc[i] ^ key
flag += long_to_bytes(a)
hash2 = hashlib.blake2b(flag).hexdigest()
if hash == hash2:
print(hash2)
print(flag)
FLAG{z3br4s_ar3_als0_x0r}
[Crypto] rsa
#chall.py
import random as rd
import gmpy2
from Crypto.Util.number import *
flag = b'FLAG{dummy}'
rd_number = rd.getrandbits(64) | 1
p = gmpy2.next_prime(rd_number)
rd_number = rd.getrandbits(64) | 1
q = gmpy2.next_prime(rd_number)
n = p * q
e = 65537
c = pow(bytes_to_long(flag),e,n)
print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')
典型的なrsaですね。
output.txtみるとnが小さい…とりまfactordb。ビンゴ。
import random as rd
import gmpy2
from Crypto.Util.number import *
n = 89765553359668267846115148791526510167
e = 65537
c = 43726401623720020767763547639229741559
p = 7188697477892891021
q = 12487040056383040627
phi = (p-1)*(q-1)
d = pow(e,-1,phi)
m = pow(c,d,n)
ans = long_to_bytes(m)
print(ans)
FLAG{0SS1FR4G3}
[Crypto] Matryoshka
問題ファイルの中身の最後に == とあるのでまぁBase64でしょう。
cyberchefを利用し解いてみる。
62->U4M2wpRDGCp5B8qkouwYiHCVQvkIgftkzhw5pTzkYx4NXozDCGWBw0fBCKUag1ngwLT3trGzk0vdPv0RiUCREvUBRikYXwxRrMREKMm1itZ9ALQwo5xzMZA1Mv1s5UO5FiS0Sy3RTFu18fVCedtK6TKNZYjpaQYk0NL2qHTDkBUOgTiFHp7Uiru2IfUxABa1ne3Jysd0x3SOHDTa29TyXfkAmRObcDtXPlGwexzflsCzch55URgFP9gMqzv62FTe7TxKcytONKCjJR4XzmW6P9nPFT9p8pvJhzjaXHygw6GUzKBE5UOxpcrezsf8B4mjyUhbOBX3EtedW4jXzAfqpnURXS1A7XEiiM6q2NUtObLzLCIWToV9pRW3
となる。さてマトリョーシカだしもっかいBASE64・・・ではない。
わからん…となったところで最初の 62-> から BASE62をいうものを知る。
58->7nH1jTqufPSpfePjTvn8iLY1zrqZ7fkGFndTJ6BRpnwumrTN151mJJ8W33oEt5FrsdLohLGmzSYHQ2E6XdpHhtc6edKjgZHPLtq6oypWaayZzC6MFmVgRZ4bdp9JVUugzbbTy7VoEAks8QU9mXMW61yo3aHcMVP2uE3G5rpRrbgckrsrqeKa25jLo2yd6As2s527fJZJeEMXBKrTCbHas8UtW9d5mVXpxqPWk1fzBQCALqrns9Q9V96pfRCQHXR8p11EoBwhPFFJUNXD2SwG
45->BL6HW5K09SL6AG6KIA 090M6HN9WNAT091N8T09GIAK09/F61C9 H9O098DBS09+H9309:F60C9WNAT09FH81C9+H94C9/F60C90JBS09TL6GY8GH8CC9IB+NAJIAS09EG6X09GIA-B9IBYY9IIA 09IBX09EH8+09IBIN9$H9T09GS8S09IH8G09TL66B8HX7
32->GE3C2PRXGU3TKMSEGNCTGNRTGE2DINJRGIYTGMJVG42EIMSEGNBTINJVIQ2DIMZZGM3DERBUIYZTSMRWGM2TGRRTIIZTMMRVGUZTGRBSGYZTKNJSGNDDGMBWGA3DA===
16->75752D3E363144512131574D2D3C455D4439362D4F3926353F3B3625533D2635523F306060
uu->61DQ!1WM-<E]D96-O9&5?;6%S=&5R?0``
FLAG{Mr_decode_master}
[Crypto] pqrneca
#chall.py
from Crypto.Util.number import *
flag = b"FLAG{dummy}"
p = getPrime(512)
q = getPrime(512)
r = getPrime(16)
n = p * q * r
e = 65537
c = pow(bytes_to_long(flag),e,n)
a = pow(p + q + r, (p - 1) * (q - 1) * (r - 1), n) * ((p + q + r) % n)
print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')
print(f'a = {a}')
rsa三つの素数版。ただpとqは512ビットなのでゴリ押しは無理そう。
rについては16bitなのでいけそう、そしていけた。
さて、pとqをどうしたものか…
a = pow(p + q + r, (p - 1) * (q - 1) * (r - 1), n) * ((p + q + r) % n)
という謎の式のうち、((p + q + r) % n)の部分は直感的に
p + q + r が n =pqrを超えることはないだろうから p + q + r でしょう。
じゃぁpow(p + q + r, (p - 1) * (q - 1) * (r - 1), n)は何になる?
数式で表すと
フェルマーの小定理っぽい・・・けどちがう・・・
オイラーの定理とやらがあるらしく、
だそうです。おお、p+q+r=aと仮定したとき、aとnのGCDは1。とすれば
pow(p + q + r, (p - 1) * (q - 1) * (r - 1), n) = 1 がなりたつ。
(p + q + r) % n = p + q + r を組み合わせると…
まぁ a = p + q + r でいいでしょう!
これにより pq と p+q がわかる。それは二次方程式でpとqを求められるということになる。
p+q、pqがわかっている場合 x^2 - (p+q)x + pq を解くことでpとqがわかるらしい。
(なぜかは知らない…)
ということで解法。
#solver.py
import math
import gmpy2
import sympy
from Crypto.Util.number import *
n = 7894997768843371051574283923889875949721549839948585431580528447785849377661136272711123916225949784565233102445109630200343891690246762600340629461935948515407628802882457327053777870536555165662186532079820972702954015707071221070209358667015358289159157419015372445758520554044321210772301888768815760388448403
e = 65537
c = 6281522859197520614425409590475837816922605179191893610058697196067537825716766495028792492058040491214412166881301355310380609363649895438105952796445812639877335162580538764889271710182530354193361284113009767902488689490066322103879429684251062356174055644278678270417287815150325455601016928165357679401805198
a = 25399154773300599428558856611099482336783148755690795638447359076396917531510107618424856270044438660480517767775671272426470020074846949629619656297238653
# 16ビットの範囲(2^16 = 65536)
# 2〜65535(含まず65536) を試す
for r_candidate in range(2, 65536):
# まず r_candidate が素数かどうかチェック
if sympy.isprime(r_candidate):
# 素数なら n を割り切れるかどうかをチェック
if n % r_candidate == 0:
print(f"16ビットの素数 r を発見: {r_candidate}")
r = r_candidate
S = a - r #p+q
P = n//r #p*q
x = sympy.var('x')
equation = sympy.Eq(x**2 - S*x + P,0)
pq = sympy.solve(equation)
p=pq[0]
q=pq[1]
phi = (p-1)*(q-1)*(r-1)
phi = int(phi)
d = pow(e,-1,phi)
m = pow(c,d,n)
print(long_to_bytes(m))
FLAG{IxMxq1SgIyMBIIMGI0q4G1MeIaABEyWlIJgjoSIHZQx}
[Crypto] fermat
qがpの次の素数ということでフェルマーの素因数分解という方法が使えるようです。
のサイトを参考に解く。#solver.py
import gmpy2
from Crypto.Util.number import *
n = 676319397735730521344913515867934466557249938830320362713104028147907475161410924302106208557578129672312112570699649320756997751047748526179420294295804316927613590646362500359104020507658340529036035270899149526454273702813287402852634727810613194948491847765876245816016547885220263697428149258930813198492876598019676735410486670056615797543724287719091455698954641253484770813537258972909311238281517969150730995384333149529847238328429765795353460752934707376610811957523573435501837106757426420781881114642789205754128429360504244479444241632983844396437167782627922552410033039437848922197363252606322937787867911241387378967150111636631701717048322098116389046175321122703888084238623535173066977835322244341329267519091875372840072587867333286629354364209002277043427436048588195176125380421921033773615132189988677607703687967780491410895234239462032852142082773143240556598165777168487170389814557079261971425454423105866029747029998106492705062189106761305859216288748576399977208908650577042000800274711166004161556754908961331763589556753014794376259259606115207134310825830822116460560549122564950637637935822464989859830843182778152927632025786667060053277719602433343998292080693367021704276072816301015536576394869
e = 65537
c = 664770802525007143114183649006136242832189927741550935760962329902059309732424301521809980196106418689617174881496296906889739322993290803900033249826583457283609844484929381726747316624714583174890351244075333339547125880555403549213431833796315857950978666222904203526684608160797705967294646151160520688186449112505033358254659042379897274546986920393898244439373303684790753059269951764517696979362344086044350912649259909606498113413674465420396758678079400706745868788994998226134818620891496314452048048354405515992789975986725419340019457814278146884813636447752534847785470343293911779166688699123725539285227602765620731322529572500876737649110866509240876649446969788110024497872073014969073164415064343190985244151158687004958297206451893083572456008882747336332262466921890643307838269580821878509391427980862837213427596174435199467256322773476561967561206542311297261289353875552748106774769305181903774843257377630554451944976305667968109176630441405588245650470960860534257538527019336908763594170060247251558054736334322859485164458617968160442028365253577887320755712718826992505421532832826293807854478396182841201625377433621886141928179684217359181086658080520668306763937364261199973193813469721007859720592820
def fermat_factors(n):
assert n % 2 != 0
x = gmpy2.isqrt(n)
y2 = x**2 - n
while not gmpy2.is_square(y2):
x += 1
y2 = x**2 - n
factor1 = x + gmpy2.isqrt(y2) # a = x + y
factor2 = x - gmpy2.isqrt(y2) # b = x - y
return int(factor1), int(factor2)
p, q = fermat_factors(n)
phi = (p-1) * (q-1)
d = pow(e,-1,phi)
m = pow(c,d,n)
print(long_to_bytes(m))
FLAG{H4nc_m4rg1n1s_3x1gu1t45_n0n_c4p3r3t}
[Crypto] pow
#chall.py
from Crypto.Util.number import *
flag = b'FLAG{dummy_dummy}'
length = len(flag)
p = getStrongPrime(2048)
q = getStrongPrime(2048)
n = p * q
e = 3
c = pow(pow(pow(pow(bytes_to_long(flag),e,n),e,n),e,n),-1,n)
print(f'length = {length}')
print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')
eが3・・・明らかに小さい。
問題は powpow してる
c = pow(pow(pow(pow(bytes_to_long(flag),e,n),e,n),e,n),-1,n)
ここをどうするか・・・
pow(pow(pow(bytes_to_long(flag),e,n),e,n),e,n) = x とすると
c = pow(x,-1,n)
xc ≡ 1 mod N
つまりxはNを法とした逆元で求まる。
あとは・・・low public exponentでしょ(鼻ホジ)
#solver.py
from Crypto.Util.number import *
from sympy import cbrt
length = 18
n = 832996564959760976823195241369036874331930836728087744536557712534268758407210844397318465111274937735608177904388673624214199725466112865913658434995056758617893416146738789244560645480693761650555452145417373022656073636509975757558533929212693073010240835577668663862110650331663621522632029066604001608679860187780880428356984998804776170584125759195027257746426876634462537399534557175458846127669938361143176408894422233692887183771609437013596861191165178360692751725359572759866548238405263847988841001651961674033885592600946485547208715748258301553558109912812150329393643732352971111679675726063105632765692271592423080233651456108639970299595693598613231239801063903573075734612106087912314081712225092451461217723056254835139645111525573214744589583796462214613329158656819495705405397141116676913364608174122526802177011274209779180902679853926069233723117954503516124963116211752312176303544030671661332858588584790506343593298612857710476468473011968842290990237137197021422496630477106206634599820992398336194454553368198828491063734484505830311730984485659740434980635242119928484356574958521353927153267881888577219655416708001725608189092871205825744442392178367369869325066568397374052340711256217931236499197767
e = 3
c = 316741640014194575297778465204998957406369590310097930350107434509189342323087258023628711552499490064704769444751049023304085971734056534821556748686263668575517610726735254595535342698426527888653741130477751417569027714896553264725137628048721129097206306370098336458618855929920964465759913799114314876427040433906507257767601896083290478567304283269182075731759950830277943950769424428416129761560973318337700083370647888654903851738821358926708037577574683219751461794578864352787385155578862042798560279711240506892922059703174951742576896678437704082404578590458354664856617194893889491977431333280667546743136612034283488192331123539144191183069405405015324629930946406197358987261496998010800402338201345334120070899246186818667816362810197749795297281910991300242412398509351866267129399381516712221188980179985666347024765206657461177660648245988058677188231979251796508905082730374031801041966726953256006539748703908954295147354567066300930050668954644398723612364180925970802769870110590297894222642541339633825480167563884415384934064323148896014656231073210559342714163091664164559117067778555116082660480362441611362340740154062816754756158875391540651321813462427341241570891546132179744209698944958960942834387569
'''
flag = b'FLAG{dummy_dummy}'
length = len(flag)
p = getStrongPrime(2048)
q = getStrongPrime(2048)
n = p * q
e = 3
c = pow(pow(pow(pow(bytes_to_long(flag),e,n),e,n),e,n),-1,n)
print(f'length = {length}')
print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')
'''
#pow(pow(pow(bytes_to_long(flag),e,n),e,n),e,n)
pow1 = pow(c,-1,n)
print(pow1)
print("===============")
#pow(pow(bytes_to_long(flag),e,n),e,n)
pow2 = cbrt(pow1)
print(pow2)
print("===============")
#pow(bytes_to_long(flag),e,n)
pow3 = cbrt(pow2)
print(pow3)
print("===============")
flag=cbrt(pow3)
print(flag)
print("===============")
print(long_to_bytes(flag))
FLAG{p0wp0wp0wp0w}
Forensics
Concealment以外は即解ける問題だった。
[Forensics] What is this file?
zip解凍すると拡張子なしのファイルが出てくるので file コマンドで調べてみる。
$ file unknow
unknow: Composite Document File V2 Document, Little Endian, Os: Windows, Version 10.0, Code page: 932, Template: Normal.dotm, Revision Number: 9, Name of Creating Application: Microsoft Office Word, Total Editing Time: 08:00, Create Time/Date: Fri Nov 1 00:46:00 2024, Last Saved Time/Date: Wed Nov 13 01:56:00 2024, Number of Pages: 1, Number of Words: 0, Number of Characters: 1, Security: 0
Office Wordとあるしdocかdocxでしょう。
後は開いて終わり。
FLAG{Open_old_word_file}
[Forensics] SVG
ファイルをテキストエディタで開いてみるとところどころ
<Flag content=~ という記述がある、ので抽出してみる。
$ cat image.svg | grep Flag
<Flag content="import base64"/>
<Flag content="parts = ["/>
<Flag content="[70, 76, 65, 71],"/>
<Flag content="[123, 53, 86, 71],"/>
<Flag content="[95, 52, 110, 100],"/>
<Flag content="[95, 88, 77, 49],"/>
<Flag content="[95, 52, 114, 51],"/>
<Flag content="[95, 102, 52, 109],"/>
<Flag content="[49, 108, 121, 125]"/>
<Flag content="]"/>
<Flag content="flag = ''.join(chr(x) for part in parts for x in part)"/>
<Flag content="encoded_flag = base64.b64encode(flag.encode()).decode()"/>
<Flag content="print(''.join(base64.b64decode(encoded_flag).decode()))"/>
後は余計な文字抜いてpythonで実行すればいける。sakuraで置換とか。
FLAG{5VG_4nd_XM1_4r3_f4m1ly}
[Forensics] Liangmen
$ file liangmen.zip
liangmen.zip: PNG image data, 1310 x 730, 8-bit/color RGBA, non-interlaced
PNGファイルですね。拡張子変えて終わり。
FLAG{Waiting_for_Liangmen_Ron}
[Forensics] Concealment
zip解凍してくるとQRコードの画像ファイルが出てくるのでQRコード読み込んでみる。
Exiftoolね・・・じゃぁexiftoolでチェックしてみる。
すると、
「Keywords: Look_at_the_ApplicationNotes_in_this_image」
と気になる出力が。・・・ApplicationNotesとは?なんやらxmpとかでてきたので
exiftool -xmp -b ファイルパスしてみると
"53 65 61 72 63 68 5F 66 6F 72 5F 53 74 65 67 68 69 64 65"
とでてきたのでcybershefすると Search_for_Steghide となった。
Steghideというツール使って以下実施。
steghide.exe --extract -sf concealment.jpg
Enter passphrase:
wrote extracted data to "secret.txt".
passphraseは問題に書かれている。secret.txtを開いて終わり。
FLAG{Herodotus_the_father_of_history}
Web
執筆中...Webは苦手なのでMeta,login,inputしか解けず。
Lord to SQLIとかで勉強せねば…
Network
執筆中...Networkは全完!最後はTLS1.2とか1.3勉強してたので意地で解きました。
Reversing
執筆中...pwnはなかった。ぼちぼち苦労したものの全完。
Discussion