2024 TFCCTF Writeup

记录一下看了的几道题。有两道Crypto代码实在是冗长,没什么做的欲望。

Crypto

CCCCC

5c4c4c6c4c3c4c3c5c4c4c6c7cbc6c3c7c3c6c8c6cfc7c5c7c4c5cfc6c3c6cfc7c5c7c4c5cfc6c3c7c4c3c0c5cfc6c3c6cdc7c9c5cfc6c3c6c2c3c0c7c9c5cfc6c3c3c4c6cec6c4c5cfc6c3c6cdc7c9c5cfc6c3c6c4c6cfc6c7c5cfc6c3c6c1c6cec6c4c5cfc6c3c6cdc7c9c5cfc6c3c6c3c3c4c3c7c7cdc0ca

把c去掉之后hex to char就行。

Conway

task

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from secret import generate_next_key, flag
import hashlib
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

initial = 11131221131211131231121113112221121321132132211331222113112211

initial = generate_next_key(initial)
print(initial)

initial = generate_next_key(initial)
h = hashlib.sha256()
h.update(str(initial).encode())
key = h.digest()

cipher = AES.new(key, AES.MODE_ECB)
print(cipher.encrypt(pad(flag.encode(),16)).hex())

output.txt

plaintext
1
2
311311222113111231131112132112311321322112111312211312111322212311322113212221
f143845f3c4d9ad024ac8f76592352127651ff4d8c35e48ca9337422a0d7f20ec0c2baf530695c150efff20bbc17ca4c

题目名让我想到Conway非常经典的Game of Life,不过这是个一维的情况,我不是很懂规则。最后cheng_xing提醒我其实就是数数——对于最初的initial,开始是三个连续的1,所以递推后的initial开始就是31,接着是一个连续的3,所以接着是13,以此类推。

Genetics

task

plaintext
1
2
3
I just took a quick look at my DNA. I feel like I was created for this CTF.

CCCA CACG CAAT CAAT CCCA CACG CTGT ATAC CCTT CTCT ATAC CGTA CGTA CCTT CGCT ATAT CTCA CCTT CTCA CGGA ATAC CTAT CCTT ATCA CTAT CCTT ATCA CCTT CTCA ATCA CTCA CTCA ATAA ATAA CCTT CCCG ATAT CTAG CTGC CCTT CTAT ATAA ATAA CGTG CTTC

对一下密文和已知的flag头能猜到其实就是每个字母代表两个bit而已。

exp

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys
from Crypto.Util.number import *
bin_dna = {'A':'00','C':'01','G':'10','T':'11'}

def bin_2_code(string):
string = string.replace(" ","")
string = string.replace("\n","")
final=""
for j in range(0,len(string)):
final+=bin_dna[string[j]]
return long_to_bytes(int(final,2))

input_str = input("Input:")
print(bin_2_code(input_str))

# b'TFCCTF{1_w1ll_g3t_th1s_4s_4_t4tt00_V3ry_s00n}'

Hellfire Phantom

task

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from sage.all import *
import random
from Crypto.Util.number import getPrime, isPrime, long_to_bytes, bytes_to_long
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES
from hashlib import sha256

FLAG = b'REDACTED'
secret = REDACTED
b_curve = REDACTED

p = 1154543773027194978300531105544404721440832315984713424625039
g = 2
shared = pow(g,secret,p)

print(f"p = {p}")
print(f"g = {g}")
print(f"shared = {shared}")


secret2 = bytes_to_long(FLAG)


p_curve = 4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000001
a_curve = 35220

Z = GF(p_curve)
E = EllipticCurve(Z, [a_curve,b_curve])
G = E.lift_x(Z(secret))
P = G * secret2

print(f'p_curve = {p_curve}')
print(f'a_curve = {a_curve}')
print(f'P = {P}')

output.txt

plaintext
1
2
3
4
5
6
p = 1154543773027194978300531105544404721440832315984713424625039
g = 2
shared = 589382223336825905353017404337901190007770052877203421235378
p_curve = 4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000001
a_curve = 35220
P = (623096442003276996005526819582785620084071954736463701753970373963912716099078435477704571257942074621357 : 2384627087675194082373873481003992989604314757777638917742582544298077858048626428935086473569758082583040 : 1)

经典套娃。part1是个DLP,part2是个ECDLP。part1的p-1和p+1都不光滑,但是p足够小,直接cado nfs就能跑出来。

part2的p_curve-1很光滑,但是曲线order并不令人满意。不过出题人告诉我flag长度只不过16 chars,所以姑且还是可以在subgroup上pohlig hellman一下。

中间那一步把secret lift到点G时,出题人实际上用的是-G,有点幽默。

exp

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from Crypto.Util.number import long_to_bytes
from sage.all import *
p_curve = 4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000001
a_curve = 35220
b_curve = 85127
secret = 3182763716837142378046258424310770114697574212011835
Z = GF(p_curve)


E = EllipticCurve(Z, [a_curve,b_curve])
try:
G = E(3182763716837142378046258424310770114697574212011835 ,2312946128953497569445083537734048164871112582045360268346156095918010577593177039498521291057451954433727)
P = E(623096442003276996005526819582785620084071954736463701753970373963912716099078435477704571257942074621357,2384627087675194082373873481003992989604314757777638917742582544298077858048626428935086473569758082583040)

except:
pass
print("testing...")
print(E)
print(G)
n = E.order()
factors = list(factor(n))
m = 1
moduli = []
remainders = []

print(f"[+] Running Pohlig Hellman")
print(factors)

for i, j in factors:
if i < 10**12:
continue
mod = i**j
print(mod)
g2 = G*(mod)
q2 = P*(mod)
r = discrete_log(q2, g2, ord=G.order(), operation='+')
kk = G.order()//mod
for k in range(1000):
tmp = long_to_bytes(k*kk+r)
if b'TFC' in tmp:
print(tmp)
break
# b'TFCCTF{cUrv3mAn}'

rotator cuffs

task

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sage.all import *
from secrets import SECRET, x1, x2, y1, y2

sumyum = -142226769181911294109604985414279966698269380324397182385943224688881786967396493297107323123238846393606215646973028804858833605857511769169835160302020010947120438688346678912969985151307036771093126928042899151991372646137181873186360733201445140152322209451057973604096364822332301687504248777277418181289153882723092865473163310211285730079965167100462695990655758205214602292622245102893445811728006653275203674798325843446182682402905466862314043187136542260285271179956030761086907321077282094937573562503816663264662117783270594824413962461600402415572179393223815743833171899844403295401923754406401502029098878225426758204788

assert sumyum == 2 * x1 ** 2 - SECRET * y1 ** 2 + 2 * x2 ** 2 - SECRET * y2 ** 2

F = RealField(3456)
x = vector(F, [x1, x2])
y = vector(F, [y1, y2])

for _ in range(10000):
theta = F.random_element(min=-5 * pi, max=5 * pi)
R = matrix(F, [[cos(theta), -sin(theta)], [sin(theta), cos(theta)]])
x = R * x
y = R * y

print("resulting_x =", x)
print("resulting_y =", y)

output.txt

plaintext
1
2
resulting_x = (3.3634809129087361339072596725006530600959848462815297766832600914180365498172745779530909095267862889993244875375870115862675521807203899602656875152466204714275847395081849947663071267678766620524700684572851632968584152642766533856599351512856580709762480161587856072790441655306539706390277559619708164477066112096159734609814163507781608041425939822535707080207842507025990454423454350866271037975269822168384397403714076341093853588894719723841956801405249658560486108807190027518922407932998209533025998785987344569930974892824749931597842343369782141668038797305601028366704322107431479213165353278773002704707347001056980736352878716736155054293350509670339144379602697176068785416128203382284653052813910539052285224499161723972390574800570738938264516350981139157860135237512937090793549860152173756751719627025142858529263243314917653507237003568510016357713402278753999645732592631577726849749929789275649985363293274521704758513276997442425705172979362522303209937874019044195572717894784790824040985970678829869212168596332338e228, 4.3493076236586169242233212405270398931813271488805260703904730395387317512159124699671617536806847379014763743850012966440449858042327139796085868934120939346500622666309663813415016921760622643752056516232426324399548704613192843351795229042500735885925583510203795565452553753954474949980588780332651769544235511465216034600990329267883327087177217125655503845919331440817328958054102807738186874040636118222352351053320953917165679774298608790659071127811941909136888169274293065733698380573486079052876249484455409206182001827225690775874445171478338344209529207109172368590360722150559332665968826925103060717742483611155201852629766859356827518117986215929527812137774656124580645282319815982553388185475874607903050755710964732279490338614504903256117014312989278124177060468718045944298976827788272885547066724342578660563396148909159051946415261351324693896674313199869788279492452177771905587881622085592044441472137286330359635594402564357596784568377870545793505212074411425362120275312322293627143588322908897500139505746513232e228)
resulting_y = (3.0086123485184949854819528432444522887263618452152977201477700454454717599185922285792607291484161348863603668674724666302028473336653202339259214779198337146709052083562504123644969759313504022148939497579033947489964578987257010705347661159352495880621564046451129149321751369899157697461990748527068553919767557375414807745137776378672423131583632676118768803623661016450513713378889178790819115525404124475586398119768281556573742250499881136366816528002891506377591473809774876327335425713426558761290418087432306668623923825516541279687269109753438014462223886767964900168026643719447209474190574704192551865457553267219179816090151816092471203713238427208397671093453024024773606469951052196613699816481289760243547361942029869165939022611782658000517871759272476768999453412473058498224382162775678590320117678687959374599497850317809926761224934950410879753727042047871292717229649696383856159211062622325024918849176324424823611459590717866478574927162324917352318674258311617781845396479605897293293787546058229588461669469113001e228, 4.1955438730064492244518395125687091233417321001179084616477593364143186962035096742717340249485256810878365124925979444527539802357032735868877910266504910589105346718553503670072791148806000734099122372428956062737130602189826489676949800396857262364104813055382317498461363421406914514918460816121876800728600531432610837129788010503804927836206596876591613685011706833895602299866191433190745884295362337967940063679204541643670409168084686978205876941245671248753306754892761206974604980311577415661960800437927228624982030061751022139301406066860249918396002252864930009083759551916555623475795108943840654272107400479044754688171126386094896825019962082090350188892677712358612478027143147182776057102433244569971150928964257290752485837202929975257858813456753394801152212850446322739077604336730800210171231609831225616780923301071587159265696870229784689201181607735865814975046649574472138172333744474559659785291954987787639082881571990180182337133038177924408020273887276582566592470019342076814034084107444178243083855840959209e228)

给的是个旋转矩阵,左乘10000次相当于还是对原向量逆时针旋转了theta弧度。两个向量各自的分量取平方和可以获得\(x_{1}^{2}+x_{2}^{2}\)\(y_{1}^{2}+y_{2}^{2}\)的近似值,取最接近的整数即可获得准确值。

exp

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Sage
F = RealField(3456)
x1 = 3.3634809129087361339072596725006530600959848462815297766832600914180365498172745779530909095267862889993244875375870115862675521807203899602656875152466204714275847395081849947663071267678766620524700684572851632968584152642766533856599351512856580709762480161587856072790441655306539706390277559619708164477066112096159734609814163507781608041425939822535707080207842507025990454423454350866271037975269822168384397403714076341093853588894719723841956801405249658560486108807190027518922407932998209533025998785987344569930974892824749931597842343369782141668038797305601028366704322107431479213165353278773002704707347001056980736352878716736155054293350509670339144379602697176068785416128203382284653052813910539052285224499161723972390574800570738938264516350981139157860135237512937090793549860152173756751719627025142858529263243314917653507237003568510016357713402278753999645732592631577726849749929789275649985363293274521704758513276997442425705172979362522303209937874019044195572717894784790824040985970678829869212168596332338e228
x2 = 4.3493076236586169242233212405270398931813271488805260703904730395387317512159124699671617536806847379014763743850012966440449858042327139796085868934120939346500622666309663813415016921760622643752056516232426324399548704613192843351795229042500735885925583510203795565452553753954474949980588780332651769544235511465216034600990329267883327087177217125655503845919331440817328958054102807738186874040636118222352351053320953917165679774298608790659071127811941909136888169274293065733698380573486079052876249484455409206182001827225690775874445171478338344209529207109172368590360722150559332665968826925103060717742483611155201852629766859356827518117986215929527812137774656124580645282319815982553388185475874607903050755710964732279490338614504903256117014312989278124177060468718045944298976827788272885547066724342578660563396148909159051946415261351324693896674313199869788279492452177771905587881622085592044441472137286330359635594402564357596784568377870545793505212074411425362120275312322293627143588322908897500139505746513232e228
y1 = 3.0086123485184949854819528432444522887263618452152977201477700454454717599185922285792607291484161348863603668674724666302028473336653202339259214779198337146709052083562504123644969759313504022148939497579033947489964578987257010705347661159352495880621564046451129149321751369899157697461990748527068553919767557375414807745137776378672423131583632676118768803623661016450513713378889178790819115525404124475586398119768281556573742250499881136366816528002891506377591473809774876327335425713426558761290418087432306668623923825516541279687269109753438014462223886767964900168026643719447209474190574704192551865457553267219179816090151816092471203713238427208397671093453024024773606469951052196613699816481289760243547361942029869165939022611782658000517871759272476768999453412473058498224382162775678590320117678687959374599497850317809926761224934950410879753727042047871292717229649696383856159211062622325024918849176324424823611459590717866478574927162324917352318674258311617781845396479605897293293787546058229588461669469113001e228
y2 = 4.1955438730064492244518395125687091233417321001179084616477593364143186962035096742717340249485256810878365124925979444527539802357032735868877910266504910589105346718553503670072791148806000734099122372428956062737130602189826489676949800396857262364104813055382317498461363421406914514918460816121876800728600531432610837129788010503804927836206596876591613685011706833895602299866191433190745884295362337967940063679204541643670409168084686978205876941245671248753306754892761206974604980311577415661960800437927228624982030061751022139301406066860249918396002252864930009083759551916555623475795108943840654272107400479044754688171126386094896825019962082090350188892677712358612478027143147182776057102433244569971150928964257290752485837202929975257858813456753394801152212850446322739077604336730800210171231609831225616780923301071587159265696870229784689201181607735865814975046649574472138172333744474559659785291954987787639082881571990180182337133038177924408020273887276582566592470019342076814034084107444178243083855840959209e228
x1 = F(x1)
x2 = F(x2)
y1 = F(y1)
y2 = F(y2)
print((2*x1**2+2*x2**2))
print((y1**2+y2**2))
"""
"""
t1 = Integer(6.0458961313432700746931348477825758192229020432715951204522236716438606488287830118571477216061475210062738469232910543583772789009092752627010833566899296726498585367653663884152832500606045796426785544863725558993639659014043831131766285384964991019625206454962406019843219392602518434638730182803996487844535438276226041548124895578905508260052851551549731588088096686178425943892262835046783953738438780109057031247559746813562239126044914178423658072272e457)
t2 = Integer(2.6654336653979930072932080854217803878980327287812916202113733837281421458611769701044321441231223717460047958070788407898027091612528627848314033997938963634683650311201578046725621329886792733555154958650003761603106155621404806459549963777276803246893201517791757415848958560084349757549144848596659632445238472959648749998982354516391976477782686807957854536054937553191464787432683110564288464895393221593820017494097475356503877505295996914147435644564e457)
fl = 142226769181911294109604985414279966698269380324397182385943224688881786967396493297107323123238846393606215646973028804858833605857511769169835160302020010947120438688346678912969985151307036771093126928042899151991372646137181873186360733201445140152322209451057973604096364822332301687504248777277418181289153882723092865473163310211285730079965167100462695990655758205214602292622245102893445811728006653275203674798325843446182682402905466862314043187136542260285271179956030761086907321077282094937573562503816663264662117783270594824413962461600402415572179393223815743833171899844403295401923754406401502029098878225426758204788
(t1+fl)/t2

我猜Grobner basis应该也可解这题,不过赛中看穿数学关系之后手提更快,就没试验另一条路XD

Misc

mcbsh

没给附件,试验一阵子之后(嗯,输入了所有可打印字符才知道只允许输入01#$'()<\,不给附件是真有点幽默了)可以发现就是个bashFuck,一把梭了。

Discord Shenanigans V4

2024 imaginaryCTF sussy,不再赘述。


2024 TFCCTF Writeup
https://eupho.me/fb92e8a5.html
作者
Lambert Swizzer
发布于
2024年8月5日
许可协议