感覺CTF題目寫過就忘記,真的要把題解好好寫下來,之後要用到的時候直接查詢就好。
記憶力有點靠不住了,然後這邊只會提供做法,盡量不提供flag,不好意思。

BUUCTF

因為感覺比較油一點就來試試看。

MD5

這題給出e00cf25ad42683b3df678c61f42c6bda這個字串,依據題目來看就是MD5解密。

MD5訊息摘要演算法(MD5 Message-Digest Algorithm),是一種被廣泛使用的密碼雜湊函式,可以產生出一個128位元(16個字元(BYTES))的雜湊值(hash value),用於確保資訊傳輸完整一致,由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計。

網站提供的是與資料庫內的數據進行比較並解密,畢竟不可能從hash中直接獲得明文。

https://md5decrypt.net/en/

輸入後即可取得flag。

一眼就解密

題目給出的加密字串是

ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=

看到字尾有=可以先盲猜是base64,熟到不能再熟了。
decode base64 to ascii編碼之後,得到flag。

Url編碼

既然提示出是url編碼了,就找一個解url編碼的網站。

https://www.ifreesite.com/urldecoderencoder.htm

解碼後取得flag。

看我迴旋踢

題目給出的加密字串是

synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}

感覺沒什麼特別的地方,也不是hex等字串的感覺,先盲猜ROT13,然後發現解密出的字串格式是flag{…},確定取得flag。

摩絲

厲害了,直接打開維基百科查詢,對密碼對到眼睛瞎掉。
不過比較好的是密碼中間有用空格隔開,不然真的很噁。

.. .-.. --- ...- . -.-- --- ..-

翻譯過來是I LOVE YOU,提交還要大寫,不要臉。

password

原本又HxD等等軟體都打不開,想說這到底是什麼,沒想到notepad++直接打開,使用字元集GB2312來進行解碼之後可以觀看。

姓名:张三 
生日:19900315

key格式为key{xxxxxxxxxx}

要填入十個數字,猜測應該是姓名加上生日,但沒想到是縮寫,厲害了羅馬拼音。

flag{zs19900315}

變異凱撒

原本以為就是ROT13的變形,結果沒想到列出所有組合都怪怪的,然後去找了一下^,確認他在ASCII裡面。

然後可以看到一些規律。

a+5=f
f+6=l
...

然後直接解碼就好,取得flag。

def caesar(cipher):
j = 5
for i in cipher:
print(chr(ord(i) + j), end='')
j += 1


caesar("afZ_r9VYfScOeO_UL^RWUc")

Quoted-printable

題目給的密文是

=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6

先查詢Quoted-printable是什麼東西,發現維基百科的定義如下。

Quoted-printable或QP encoding,沒有規範的中文譯名,可譯為可列印字元參照編碼或使用可列印字元的編碼。Quoted-printable是使用可列印的ASCII字元(如字母、數字與「=」)表示各種編碼格式下的字元,以便能在7-bit資料通路上傳輸8-bit資料, 或者更一般地說在非8-bit clean媒體上正確處理資料。這被定義為MIME content transfer encoding,用於e-mail。

以此網站進行decoder即可取得flag內容。

https://www.webatic.com/quoted-printable-convertor

Rabbit

題目給的密文是

U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI

先查詢Rabbit密碼是什麼東西,網路上的資訊如下。

Rabbit流密碼是由Cryptico公司(http://www.cryptico.com )設計的,金鑰長度128位,
最大加密訊息長度為264 Bytes,即16 TB,若訊息超過該長度,則需要更換金鑰對剩下的訊息進行處理。它是目前安全性較高,加/解密速度比較高效的流密碼之一,在各種處理器平臺上都有不凡的表現。

http://tools.jb51.net/password/rabbit_encode

使用此網站進行解碼即可取得flag。

籬笆牆的影子

題目給的密文是

felhaagv{ewtehtehfilnakgw}

題目給出的題示是 :
星星還是那顆星星喲
月亮還是那個月亮
山也還是那座山喲
梁也還是那道梁
碾子是碾子缸是缸喲
爹是爹來娘是娘
麻油燈呵還吱吱響
點的還是那麼丁點亮
哦哦

完全…看不懂,查詢之後發現是歌詞。

哭阿,方向完全錯了,這是柵欄密碼。

felhaagv{ewtehtehfilnakgw}
f l a g { w e t h i n k w
e h a v e t h e f l a g }

於是可以用這種簡單的方法解出flag{wethinkwehavetheflag}

爛死了。

丟失的MD5

題目給出一個py檔。

import hashlib   
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print(des)

嘗試運行後發現被提示需要編碼,修正後讓他可以運行。

import hashlib   
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
m.update(str('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM').encode('utf-8'))
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print(des)

執行後獲得

e9032994dabac08080091151380478a2

感覺是hex(十六進位),但丟進去decoder成ascii和base64都不太對的感覺。
然後發現自己是笨蛋,題目就說他是MD5,啊我怎麼沒感覺。

最後發現這就是答案了,哭阿哭阿,我是笨蛋。

RSA

p=473398607161,q=4511491,e=17,求解 d

使用公式解就可以了

import gmpy2
p =gmpy2.mpz(473398607161)
q =gmpy2.mpz(4511491)
e =gmpy2.mpz(17)
phi_n= (p - 1) * (q - 1)
d = gmpy2.invert(e, phi_n)
print("d is:")
print (d)

拿到flag

Alice與Bob

密碼學歷史中,有兩位知名的傑出人物,Alice和Bob。他們的愛情經過置換和輪加密也難以混淆,即使是沒有身份認證也可以知根知底。就像在數學王國中的素數一樣,孤傲又熱情。下面是一個大整數:98554799767,請分解為兩個素數,分解後,小的放前面,大的放後面,合成一個新的數字,進行md5的32位小寫哈希,提交答案。

整數n小於256bit,可以透過本地工具爆破成功,直接打開RSATool2v17。

不然也可以使用線上工具 http://factordb.com/ 查詢。

爆破結果p = 101999, q = 966233

以 101999966233 在 http://www.hiencode.com/hash.html 這類線上工具進行MD5的hash計算,得到flag。

rsarsa

題目:

Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.

p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

Use RSA to find the secret message

利用RSATool2v17計算出d

d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
n = p * q

print(pow(c, d, n))

得到flag。

大帝的密碼武器

看到大帝直覺又是凱薩密碼,

用HxD打開,看到開頭兩個字是PK,應該是zip的標示,加上副檔名.zip之後解壓縮,得到題目。

公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
以下密文被解开后可以获得一个有意义的单词:FRPHEVGL
你可以用这个相同的加密向量加密附件中的密文,作为答案进行提交。

將FRPHEVGL跑25種ROT之後可以得到

FRPHEVGL
GSQIFWHM
HTRJGXIN
IUSKHYJO
JVTLIZKP
KWUMJALQ
LXVNKBMR
MYWOLCNS
NZXPMDOT
OAYQNEPU
PBZROFQV
QCASPGRW
RDBTQHSX
SECURITY
TFDVSJUZ
UGEWTKVA
VHFXULWB
WIGYVMXC
XJHZWNYD
YKIAXOZE
ZLJBYPAF
AMKCZQBG
BNLDARCH
COMEBSDI
DPNFCTEJ

懶得看哪個是有意義的單詞,直接丟Google翻譯,得到單詞是SECURITY,順便確定只是簡單的ROT13。
然後沒找到要加密的密文在哪,後來發現SECURITY也不是密文 = =,查了一下發現大家還會拿到一個密文叫ComeChina,題目感覺出了問題,丟進ROT13,得到flag。

Windows系統密碼

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::

https://www.secpulse.com/archives/65256.html 此篇文章可以看出windows有兩種密碼處理方式,其中NT LAN Manager(NTLM)的格式跟題目給出的格式一樣。

將06af9108f2e1fecf144e2e8adef09efd和a7fcb22a88038f35a8f39d503e7f0062分別丟入 https://www.cmd5.com/ 後,後者可以得到有意義的flag。

凱撒?替換?呵呵!

題目給的密文如下

MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO} 

先跑過一遍凱薩密碼,感覺都不像,就改用替換密碼爆破。

https://quipqiup.com/ 上輸入密文和已知替換字 MTHJ=flag ,暴力破解後的第一個選項就是flag。

萌萌噠的八戒

題目無法解壓縮,用notepad++打開來看,發現是rar,改用rar解壓縮取得題目。

先看檔案內有沒有flag和隱藏的區塊,檢查之後找不到,圖片左下感覺是密碼。

http://www.hiencode.com/pigpen.html

照著輸入,取得密碼。

RSA1

題目給出

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

參照 此論壇,得知DP is d mod (p − 1), similarly DQ is d mod (q − 1).

c=memodnm=cdmodnϕ(n)=(p1)(q1)dp=dmod(p1)dq=dmod(q1)c = m^e mod n\newline m = c^d mod n\newline ϕ(n) = (p-1) * (q-1)\newline dp = d mod (p-1)\newline dq = d mod (q-1)

要解密求出明文m,要先拿到 cdc^d,利用中國剩餘定理,可以得到m1=cdmodpm1 = c^d mod pm2=cdmodqm2 = c^d mod q

k(p1)=1modpd=dp+k(p1)m1=cdqmodqm2=cdpmodpm=(((m2  m1)  p1modq) p+m1)modnk(p−1) = 1 mod p\\ d = dp + k ∗ (p−1)\\ m1 = c^{dq} mod q\\ m2 = c^{dp} mod p\\ m = (((m2 − m1) ∗ p^{−1} mod q) * p + m1) mod n

import libnum
def egcd(a, b):
if (b == 0):
return 1, 0, a
else:
x, y, q = egcd(b, a % b) # q = GCD(a, b) = GCD(b, a%b)
x, y = y, (x - (a // b) * y)
return x, y, q


def mod_inv(a, b):
return egcd(a, b)[0] % b # 求a模b得逆

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

invq = mod_inv(p, q)
mp = pow(c, dp, p)
mq = pow(c, dq, q)
m = ((mp - mq) * invq % p) * q + mq
print(libnum.n2s(m))

然後noxCTF要代換成flag,提交拿分。

權限獲得第一步

Administrator:500:806EDC27AA52E314AAD3B435B51404EE:F4AD50F57683D4260DFD48AA351A17A8:::

看題目感覺就是之前學到的windows密碼,打開 https://www.cmd5.com/ ,將 F4AD50F57683D4260DFD48AA351A17A8 輸入即可取得flag。

old-fashion

Os drnuzearyuwn, y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz, ydderxosa ze y rlatfyr jnjzli; mjy gfbmw vla xy wbfnsy symmyew (mjy vrwm qrvvrf), hlbew rd symmyew, mebhsymw rd symmyew, vbomgeyw rd mjy lxrzy, lfk wr dremj. Mjy eyqybzye kyqbhjyew mjy myom xa hyedrevbfn lf bfzyewy wgxwmbmgmbrf. Wr mjy dsln bw f1_2jyf-k3_jg1-vb-vl_l

看題目感覺是詞頻分析,就直接用爆破攻擊,取得flag。

世上無難事

VIZZB IFIUOJBWO NVXAP OBC XZZ UKHVN IFIUOJBWO HB XVIXW XAW VXFI X QIXN VBD KQ IFIUOJBWO WBKAH NBWXO VBD XJBCN NKG QLKEIU DI XUI VIUI DKNV QNCWIANQ XN DXPIMKIZW VKHV QEVBBZ KA XUZKAHNBA FKUHKAKX XAW DI VXFI HBN QNCWIANQ NCAKAH KA MUBG XZZ XEUBQQ XGIUKEX MUBG PKAWIUHXUNIA NVUBCHV 12NV HUXWI XAW DI XUI SCQN QB HZXW NVXN XZZ EBCZW SBKA CQ NBWXO XAW DI DXAN NB NVXAP DXPIMKIZW MBU JIKAH QCEV XA BCNQNXAWKAH VBQN HKFI OBCUQIZFIQ X JKH UBCAW BM XLLZXCQI XAW NVI PIO KQ 640I11012805M211J0XJ24MM02X1IW09

使用跟上題一樣的爆破攻擊,然後flag要改小寫。

RSA3

c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n=22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1=11187289
c2=18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2=9647291

看題目應該是要做公共模數攻擊,假如採用兩個或者兩個以上的公鑰(N,e)來加密同一條資訊,可以得到:

c1 = pow(m, e1, N), c2 = pow(m, e2, N)

分別拿對應的私鑰來解密,可以得到相同的明文m

m = pow(c1, d1, N), m = pow(c2, d2, N)

假設已知n,e1,e2,c1,c2,即可得到明文m,因為e1和e2互質,所以使用歐幾里得演算法(找兩整數的最大公約數)可以找到能夠滿足以下條件的x,y

pow(x,e1)+pow(y,e2)=1
import sys
import libnum

sys.setrecursionlimit(20000)

def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)

def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('modular inverse does not exist')
else:
return x % m

c1 = 22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n = 22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1 = 11187289
c2 = 18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2 = 9647291

s = egcd(e1, e2)
s1 = s[1]
s2 = s[2]

if s1 < 0:
s1 = - s1
c1 = modinv(c1, n)
elif s2 < 0:
s2 = - s2
c2 = modinv(c2, n)

m = (pow(c1, s1, n) * pow(c2, s2, n)) % n
print(libnum.n2s(m))

取得flag,要注意的是過程中可能因為迭代次數過多被終止執行。

RSA2

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657

c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
import gmpy2
import rsa
import binascii

p = 0
e = 65537
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
temp = dp * e
for i in range(1, e):
if (temp - 1) % i == 0:
x = (temp - 1) // i + 1
y = n % x
if y == 0:
p = x
break
q = n // p
# '//'代表向下取整,'/'得到的是浮點數
d = gmpy2.invert(e, (p - 1) * (q - 1))
key = rsa.PrivateKey(n, e, d, p, q)
m = pow(c, d, n)
print(binascii.unhexlify(hex(m)[2:]))

取得flag。