前言

比赛时间:2025.4.12 - 2025.4.13

TGCTF 2025 WriteUp,emm挺遗憾的是,当时我的电脑上没有VS2022的环境,好几个都没法动态调试。不然能多做几道

Misc

你的运气是好是坏?| FINISHED - Spreng

1
好運來 祝你好運來 好運帶來了喜和愛 好運來 我們好運來 迎著好運興旺發達通四海 疊個千紙鶴 再系個紅飄帶 願善良的人們天天好運來 你勤勞生活美 你健康春常在 你一生的忙碌為了笑逐顏開 打個中國結 請春風剪個彩 願祖國的日月年年好運來 你鳳舞太平年 你龍騰新時代 你幸福的家園迎來百花盛開 好運來 祝你好運來 好運帶來了喜和愛 好運來 我們好運來 迎著好運興旺發達通四海 疊個千紙鶴 再系個紅飄帶 願善良的人們天天好運來 你勤勞生活美 你健康春常在 你一生的忙碌為了笑逐顏開 打個中國結 請春風剪個彩 願祖國的日月年年好運來 你鳳舞太平年 你龍騰新時代 你幸福的家園迎來百花盛開 好運來 祝你好運來 好運帶來了喜和愛 好運來 我們好運來 迎著好運興旺發達通四海 好運來 祝你好運來 好運帶來了喜和愛 好運來 我們好運來 迎著好運興旺發達通四海 好運來 祝你好運來 好運帶來了喜和愛 好運來 我們好運來 迎著好運興旺發達通四海 通四海 好運來 

flag为TGCTF{1~99999999中的某一个数字}

六百六十六,都不带盐了。纯狗运啊,我本来猜测是作者或者歌曲日期的,发现都不对,随手填了一个114514。

TGCTF{114514}

Reverse

Base64

清晰的逻辑,魔改Base64

魔改了位的分配和basetable,然后取basetable时还移位24了,所以解密时对basetable先移位24位

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
44
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define _BYTE unsigned char

void base64decode(_BYTE *C, int len, _BYTE *P)
{
int v3;
__int64 v5;
char v6;
int i, j;
unsigned char block[4];
// unsigned char basetable[65] = "GLp/+Wn7uqX8FQ2JDR1c0M6U53sjBwyxglmrCVdSThAfEOvPHaYZNzo4ktK9iebI";
unsigned char basetable[65] = "53sjBwyxglmrCVdSThAfEOvPHaYZNzo4ktK9iebIGLp/+Wn7uqX8FQ2JDR1c0M6U";

for (i = 0; 4 * i < len; ++i)
{
block[3] = 0;
block[2] = 0;
block[1] = 0;
block[0] = 0;
for (j = 0; j < 4; ++j)
{
if (C[j + 4 * i] == '=')
break;
else
block[j] = strchr(basetable, C[j + 4 * i]) - (int)basetable;
}
P[3 * i] = ((block[0] << 2) | (block[1] >> 4)) & 0xFF;
P[3 * i + 1] = ((block[1] << 4) | (block[2] >> 2)) & 0xFF;
P[3 * i + 2] = ((block[2] << 6) | block[3]) & 0xFF;
}
}

int main()
{
_BYTE C[] = "AwLdOEVEhIWtajB2CbCWCbTRVsFFC8hirfiXC9gWH9HQayCJVbB8CIF=";
_BYTE P[100];
base64decode(C, strlen(C), P);
printf("%s\n", P);
// HZNUCTF{ad162c-2d94-434d-9222-b65dc76a32}
return 0;
}

水果忍者

dnspy反编译

1
2
3
GameManager.encryptionKey = "HZNUHZNUHZNUHZNU";
GameManager.iv = "0202005503081501";
GameManager.encryptedHexData = "cecadff28e93aa5d6f65128ae33e734d3f47b4b8a050d326c534a732d51b96e2a6a80dca0d5a704a216c2e0c3cc6aaaf";

AES解密:HZNUCTF{de20-70dd-4e62-b8d0-06e}

下次试试直接修改代码。

蛇年的本命语言

简单python反编译,第一部分的字符字符串:flag中的字符替换为频率,第二部分将flag的字符变成字符+频率的形式,将这个新的字符串的每个字符的ascll码构建方程组

sympy解方程组,由于变量名的排序会出现错排如0,1,10,11…,需要手工调一下。

然后用第一部分的字符串,频率换回原来的字符即可

XTEA

4字节逆序,xtea加密,key用随机数取的,但种子已经给了。

可恶,我看这个cipher是输入的,以为是爆破题,爆破完发现就是常规值,气死啦。

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>

#define _BYTE unsigned char
#define _DWORD unsigned int

unsigned int *__fastcall xtea_decrypt(int a1, unsigned int *a2, unsigned int *a3, __int64 a4)
{
unsigned int *result; // rax
unsigned int v5; // [rsp+24h] [rbp+4h]
unsigned int v6; // [rsp+44h] [rbp+24h]
unsigned int v7; // [rsp+64h] [rbp+44h]
int i; // [rsp+84h] [rbp+64h]

v5 = *a2;
v6 = *a3;
v7 = -a1 * 32;
for (i = 0; i < 32; ++i)
{
// printf("%d %d %d\n", v5, v6, v7);
v6 -= (*(_DWORD *)(a4 + 4LL * ((v7 >> 11) & 3)) + v7) ^ (v5 + ((v5 >> 5) ^ (16 * v5)));
v7 += a1;
v5 -= (*(_DWORD *)(a4 + 4LL * (v7 & 3)) + v7) ^ (v6 + ((v6 >> 5) ^ (16 * v6)));
}

*a2 = v5;
result = a3;
*a3 = v6;
return result;
}

int main()
{
int i;
_DWORD key[4];
unsigned int delta;
_BYTE enc_flag[] = {
0x24, 0x23, 0xCB, 0x8C, 0x1A, 0x74, 0xA7, 0x09,
0x8D, 0x67, 0x3C, 0xFB, 0x79, 0x3A, 0x08, 0xF6,
0x1B, 0x24, 0xCC, 0xF1, 0xF2, 0x59, 0xFA, 0x39,
0xCC, 0xE1, 0xAB, 0xF2, 0x72, 0x9F, 0x18, 0x17};
_BYTE flag[33];
_DWORD v10[15];
srand(0x7E8u);
for (i = 0; i < 4; ++i)
key[i] = rand();

// test();

for (delta = 0x9e3779b9; delta < 0xFFFFFFFF; delta++)
{

strcpy(flag, enc_flag);
flag[32] = 0;

for (i = 6; i >= 0; --i)
{
xtea_decrypt(delta, &flag[4 * i], &flag[4 * i + 4], key);
if (i == 6 && flag[28] != '}')
break;
}

if (!strncmp(flag, "UNZH", 3))
{
printf("%s %x\n", flag, delta);
break;
}

if (delta % 0x1000000 == 0)
printf("%x\n", delta);
}

// UNZH{FTC-6ea75f97b4-4b-49-32}be8

for (int j = 0; j < 32; j += 4)
{

v10[j / 4] = *((char *)flag + j + 3) | (*((char *)flag + j + 2) << 8) | (*((char *)flag + j + 1) << 16) | (*((char *)flag + j) << 24);
}
for (i = 0; i < 7; ++i)
{
*(_DWORD *)(flag + 4 * i) = v10[i];
}
*(_DWORD *)(flag + 28) = v10[7];

printf("%s\n", flag);
// HZNUCTF{ae6-9f57-4b74-b423-98eb}

return 0;
}

HZNUCTF{ae6-9f57-4b74-b423-98eb}

Crypto

费克特尔

分解质因数

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
from Crypto.Util.number import *
import math

c = 670610235999012099846283721569059674725712804950807955010725968103642359765806
n = 810544624661213367964996895060815354972889892659483948276203088055391907479553
e = 65537

# Sat Apr 12 10:35:44 2025 p3 factor: 113
# Sat Apr 12 10:35:44 2025 p5 factor: 18251
# Sat Apr 12 10:35:44 2025 p7 factor: 2001511
# Sat Apr 12 10:35:44 2025 p27 factor: 214168842768662180574654641
# Sat Apr 12 10:35:44 2025 p39 factor: 916848439436544911290378588839845528581
p = [
113,
18251,
2001511,
214168842768662180574654641,
916848439436544911290378588839845528581,
]
phi = math.prod([i - 1 for i in p])

d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
# b'TGCTF{f4888_6abdc_9c2bd_9036bb}'

宝宝rsa

题目

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
from math import gcd
from Crypto.Util.number import *
from secret import flag

# PART1
p1 = getPrime(512)
q1 = getPrime(512)
n1 = p1 * q1
phi = (p1 - 1) * (q1 - 1)
m1 = bytes_to_long(flag[:len(flag) // 2])
e1 = getPrime(18)
while gcd(e1, phi) != 1:
e1 = getPrime(17)
c1 = pow(m1, e1, n1)

print("p1 =", p1)
print("q1 =", q1)
print("c1 =", c1)

# PART2
n2 = getPrime(512) * getPrime(512)
e2 = 3
m2 = bytes_to_long(flag[len(flag) // 2:])
c2 = pow(m2, e2, n2)

print("n2 =", n2)
print("c2 =", c2)
print("e2 =", e2)

# p1 = 8362851990079664018649774360159786938757293294328116561219351503022492961843907118845919317399785168488103775809531198339213009936918460080250107807031483
# q1 = 8312546034426788223492083178829355192676175323324230533451989649056072814335528263136523605276378801682321623998646291206494179416941978672637426346496531
# c1 = 39711973075443303473292859404026809299317446021917391206568511014894789946819103680496756934914058521250438186214943037578346772475409633145435232816799913236259074769958139045997486622505579239448395807857034154142067866860431132262060279168752474990452298895511880964765819538256786616223902867436130100322
# n2 = 103873139604388138367962901582343595570773101048733694603978570485894317088745160532049473181477976966240986994452119002966492405873949673076731730953232584747066494028393377311943117296014622567610739232596396108513639030323602579269952539931712136467116373246367352649143304819856986264023237676167338361059
# c2 = 51380982170049779703682835988073709896409264083198805522051459033730166821511419536113492522308604225188048202917930917221
# e2 = 3

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 Crypto.Util.number import *
import gmpy2

p1 = 8362851990079664018649774360159786938757293294328116561219351503022492961843907118845919317399785168488103775809531198339213009936918460080250107807031483
q1 = 8312546034426788223492083178829355192676175323324230533451989649056072814335528263136523605276378801682321623998646291206494179416941978672637426346496531
c1 = 39711973075443303473292859404026809299317446021917391206568511014894789946819103680496756934914058521250438186214943037578346772475409633145435232816799913236259074769958139045997486622505579239448395807857034154142067866860431132262060279168752474990452298895511880964765819538256786616223902867436130100322

n2 = 103873139604388138367962901582343595570773101048733694603978570485894317088745160532049473181477976966240986994452119002966492405873949673076731730953232584747066494028393377311943117296014622567610739232596396108513639030323602579269952539931712136467116373246367352649143304819856986264023237676167338361059
c2 = 51380982170049779703682835988073709896409264083198805522051459033730166821511419536113492522308604225188048202917930917221
e2 = 3

n1 = p1*q1
phi = (p1-1)*(q1-1)

for e1 in range(2**17, 2**18):
if gcd(e1, phi) != 1:
continue
try:
d1 = inverse(e1, phi)
m1 = pow(c1, d1, n1)
flag1 = long_to_bytes(int(m1)).decode()
except:
continue

while True:
a,b = gmpy2.iroot(c2,e2)
if b:
flag2 = long_to_bytes(int(a)).decode()
break
c2 += n2

print(flag1+flag2)

# TGCTF{!!3xP_Is_Sm@ll_But_D@ng3r0}

AAAAAAAA·真·签到

注意到UGBRC{RI0G!O04_5C3_OVUI_DV_MNTB}的UGBRC和TGCTF的差值分别是-1,0,1,2,3

故认为移位shift为i-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

text = "UGBRC{RI0G!O04_5C3_OVUI_DV_MNTB}"
result = ""
for i in range(len(text)):
char = text[i]
shift = i - 1
# 处理大写字母
if char.isupper():
shifted = (ord(char) - ord("A") + shift) % 26
result += chr(shifted + ord("A"))
# 处理小写字母
elif char.islower():
shifted = (ord(char) - ord("a") + shift) % 26
result += chr(shifted + ord("a"))
# 非字母字符保持不变
else:
result += char
print(result)

mm不躲猫猫

题目:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
e = 65537
===============================
[n_1]
n = 104620414822063385079326749509982471870030893600285414264987224935916290272601764523383209465433613538037960991762459760833469310204135961581840403511596166088644211015428546275493892988418626726155859624501730928694822384537353845736516967991087412959351952563730377463899768183476698424362423043497737906623
c = 46039211893589761388229614285558239355119695176816949068907191054207506730440947101388028710988726734999719468830467682553990941948390688315715650976965231516653707125993971747796355564587123089802425266994022342763366946693028597366959030863496254672081216842747104144465753908738135854355761032614829767801

[n_2]
n = 136155385285881847647215965185525314111620437662648298206297512719879362719618304990758477078778565820295983050789197481446196249495631490160624235332536575107813683782766081951446123450465630897720159758797590205308439297488584076508093180968162324630134629769513496515404803402321721368832460090329222421827
c = 89662183394841207920629365819797260101947925700835102302177181731227878954957449881945530912024549859105187175733895858270028583699811542603429941425305090712263572930206869292032730915960185806373681528825761306228562959997158901987273897776177362099560025615451752245984242926480186459915665627188585304468

[n_3]
n = 97838166150880996322271330309067876274369629304288765249967974468367105054047299499596040632925907384502862419004673114223665726506104837885822909371569060745589002030380969587694083056125880529762088534900418072441378759571612290245967363366712440121861026216057485493561216431656619679041625036650956580141
c = 13964437454524296084510225903229161859257123876632697866040207708487126396198332364645709267606449694929792345209792570053510791963531448336253575726210469465864539890677252499866753713612441273667882500168058017224495736582505959700480874460389262074140652815959688469055699161959913579169401470659235115109

[n_4]
n = 104414012452710814870605097680598206512628379244374492767447479240624513395489881648267796649097204325681020437139111489809239200240891543325545119842310141868094306405364856531235723882286394670951990820247279699581908662322090700977209258378235724854303512782381876653582770637338146610370083320542016205683
c = 82881158840663752381301293012156412156837667139486617975885122294931414239233800584880788452785824426565433162837294264882670497672373640661237256739513251217169843502230708215107997955489103032973333421550906077697455003620266617859876793492495921562432213017574083204710327670808824909752320056069246239174

[n_5]
n = 99823327577152655919881942955430441203405862718412557750434832628874011564431142403116162320302719502032615315370431727445122354675365173475960959108842673705131185515432235779337198687430269502043589489978848478071330885198888066287011818540897074331277424039757182998605121722943855660357645805326677153717
c = 64138140240395665924604130130703540113256964046054792668268574048575684146042187358538769647646826411085147480827784068745180715064157256643530984132712374746041235071459578557497303083281429793485934099219969514633245125822049070217273545487615694689955426204739083406630834370776842330036968574339849312190

[n_6]
n = 90248365015461553299898947837419575685297696972462936965177693228158751120540052910252324465443891464072089492969551376378871872695721660747109548018879225735392583821723157787309278187199003459586595097068752600095247478763948136028872918472784517794186246938117176464805239704409618972143063753329505566853
c = 1223888729370280608766408497925046298425450348475284427245593721486677451374468326993646894433196784805828316395498508329520722177308210723319637874241965908787713633812806440948367216379440947308444484034237493420426695742994319947973787416278207394357344618722581642427663321180647265844445386795487560858

[n_7]
n = 94301600004957404266556049084426784947851528267810628496480180851237620577304221709916982386576998311327072033147184826449394769608326104893954128903966864163663992266019244394627758978231671671541415036785806102418923157988170641749789081578513122682013855878981445323502941212687339286209950916049829329187
c = 82863658163999555104982625957574084596896562517734036934606118180244186596013418259858429681535345561639916993457165170775791581510308180862345406598823456939294419306667134634269429977644283692866602683240830596570130273545693685907124378153685099119789311788059184914707444767893674300246508953649015681088

[n_8]
n = 138170846301125942544269528744423947570529693718702890060589562072507810299909374867578243513284575250911481367534521588818327369799372617013333797662648828094081675473684406506957984907476220469711444738611866548585674505249902648164090122673746393223709022870555269699592064314818239962909612890442312536933
c = 119491008614166618841992196881667810795520664399142702036770629613897435080974181361028261908409801454926881075401108841568189702203622458656829859177063551730844676750575953975812052429747999704001795514743286102185049083720492556614745899457272537611852473621247097119159488258837994164495342656615476302293

[n_9]
n = 99901179729466406997922350743173808335015436647254619150427257167185543967050112627966407293196288285044671444967319335613534165252968178742796010193662584739560998687124865190606432448575536720824666312791430118010828122012890994586807518564096074794014835645108286554069368202103540075137356780856603244771
c = 40949907108391333609720915101613553123371146309830061575032335884884685212781529054807943471531015409944714724754037484012671956839250763388297109533737287622070764203904098500668030151150924717345985380483608467246475689588355409720763724390243856239025656921590604001847453755775742556441416378253225782045

[n_10]
n = 61259690030437494665426739847257152273395280130837116404942961022205772370190262747451577687684105785729566638453953643821737649627970942826417199458528269898125881584665758246625505537450238486870409634480317106977874179837348319750569863206089421857959928948968490914332458264088528882363587362546115476251
c = 10692583709802517287930376649896453621521035451564315558444774153067965107653136923487082233843270601808293644966170765029706088111741391700718327393258142617729248507339361448214949280176995019279632751180066719588055722391265746855172906890300921322899541689661567468774910639893953734407333686955281968991

[n_11]
n = 61801039992828445962366192979879213579034618929625634137120257905363978638538524619375061476757245266904915273416909418840046887399433511888387463824393594567840703853932743962712886373493942192676347226424517033517271152629683484135645803084066312864114637935053614714648933122150287993866439987611541220969
c = 10954274353991105637557727664545210588822691288407080879449837043794604324870247005437716228395288744012991388616203129640408571481134055220861654888292000079401922754349164416070902140135750687970710746596746307040822491545884725291812622162525094521528191986864571199953770504742086093754298024706688942928

[n_12]
n = 81076578036433170079082060836251685409287159446492965753296193307212279343201967736475565889190946261084018661195513222887762729102719817463298142435098272288250455906191971306724773977704843489656384202130835772028461187750372122197493270556005946889088028901632597942947850025951446511574872271538279172293
c = 28588867978892890299123101792867355705290435712099342525411465487097050420749940637639374841366314897499067089478542918061978965078760947752781916587927764087734267821483523703898120835527780177065213641081291514925902487762337571992584303375758239828857480300529159002038173766923215063406196287270281994110

[n_13]
n = 71157530232168231071136890858912616050720830400022706299714461019258910354851417650227422961886365022306141477702824881599077623195801641964057263386031786220270890082089447766654209469387927987335260990984685945401925861903655650392938594865200916004709406149687172952181674325358107989641197765842163904547
c = 27960181215930944825487403120483445285549624807444954861078101716612013743479552799262420582301067324579888715200194831185242773332005168956859526124595540207082642989519872446505766401363375766517640847713946346877947806553907090624698961288800133781997732503324975289915749170584907965906576569454791362716

[n_14]
n = 66972648047375401600966868890460223407049464787687477233543254745626282151414582703711121179221058247651761267900898225903976203880613931632194874983043030539016993590676102349957616653491527988171250828064867642424963623959132504648424440781640680504700708119332029568543096316060268809505043468916214805513
c = 60835135959791008690787814428104042871068368305340120883899568388232284733018967302193949855079169482639685706640962794034354074444182486368506005576035610719914663064491492453959532118366777810500578191258738886381059084295580203383314309232955684615288245065267787325644339730306113924643772851852254974447

[n_15]
n = 90257637943598108316769497507794508593198806302392993521070418011991721766720752879485768447222083665431446115452523069625768629087198843486179127627688891514510660821010755020225100968675551771499095646313769726939397657740949967858530715457699721915837776214979058584769812249030196060963967766503952342313
c = 4399313549134622905685042154653087546829550910787423655419326566487878138253206359509288756495066332688825657315393329979416459694050238332939436214209529989902054986831591699570809096389539557895185915401991616918262699503508747929872338216502127614214065785380825327547608094369072262475865753199634917243

[n_16]
n = 92288251740600331464419220550566043483318956046633993383068422751131440697160804724009965543419750026416145402171946239689160353343558812650051732083425661211116525981882827129786285507421384186253914385945235839575942689159175143843170584595031563834194522396791461112821621800304795101789634774174454963923
c = 66247987728121195021048077968716090081849970921058095317354141115909675926873116470141983756969079542376202625155266240762945918052265405682130314708469394971687236301195491947843935012259628382158162193578005325779969088722810703761417697325724612365005066194053189048901730077756974814700579148238309842127

[n_17]
n = 69827077115568693338658530875808427671954833979587031673719819999982837118678966004630045025949355988108488971089469456573587826096181206180504021005589295303686058202337425160037577216512544874916659317879664486251344000204924121435478175340685277219630619759748397121310072824905427346314024289371793912511
c = 41961541529750170616647278321641897011519854170766331727250048812589068480312085578768151129262884426947065380762103627693081345115074811616528854812168141383304088815422297153742050890507255438405990962029560578841792672129077703992563889849131151026125890119428775426873159430059036108088873321237025365358

[n_18]
n = 121967509067813105411086531144570873813192438551353178244135305741941444885017879430265551135740001199881109528100015326618038641360496483748825955036785972103400120249819219515635771224670126658284122783204302878023875811221532401827466979985960758004984121521325952830430974045801555031712045538716943996723
c = 56685268855458449301807361992185903395597392151912521111631437180065784801852096532529914802338195640469288263142147157273947747638162749552053228362964253085471152499570837646190222747929748096979121775764723331627546226024083599380351478409656463017930399581089017887517605437054166812501653272994305049733

[n_19]
n = 111443052209737188054980912596162706015139783786609288606533946708676690565398361227327894393619361319986987105479808487817585338876690712274387199821822463901215385473552030769905055879411818185403467682658270584733008692794033574579656016628470672448456704070463193623651351708851493606658113454562567882661
c = 43063936534303512947747167344506435082446824926097920117523394928030369927880018399419359991527162493235267016416838487018780946144446357441103107132169534930859416679537307845573892372204094363648842008627025957417743819712548780548638411753631418121273062911493469263026439608376883943145341779233547349322

[n_20]
n = 95620970653115821773446688521489956525828853169640893473222967682133652620358237668549573949380199526055232887654104696571224326591336762618919861506923955551797033258152132330235021156256598798132150199923133163071780984430617120833384712466833259138293611424196294549754790929522798073754475302543066810743
c = 91169514280852748423033050397827518019817961586213917174038858129257009995113093470448250725086280286170678089050234174099511369579341419962038031802624545869067250826450322548758429711203364340708549417927947792532084430609434623786029296423816717020689535357554451463107098397308992129847312441034090896054

[n_21]
n = 124459121435252896777500422250770572324857852710447484525638245458046469810759653904386808397836485937480907526066675846846520234694216388767247413055775273377784217457842271722405085516541895286181193855041203802309799146536571497448784444626120767476230109922946020087790478941065170405108420502950780133523
c = 31093240913979248685149171690112008628787979057692479889383006812352691515320164771142647979614495403955948954659560787370320141750652034536411365349410185683329265665259057268279825368747472043471647395698722820688715744644164047773730191101752121825958698066913241659826405486783122723635730561796940158209

[n_22]
n = 81003649135399280604842700104760993194465757071677051471315130409609378910142544915378149900405963802123740729794683591795243782387944402010717523706170293193013567657184591547272086787248471917203180979462232769467918763279576984067235329340647626314893413320227300379671225813004347947887556793324907475161
c = 44574763638238888886413256782673998315683494885040898927663006383199262443563576364203866155221980255226080343413308265988173997445413293009039817487501278047992287533365144990492783676929885753160063328137593489873818942984326464370764083819180424063003855862513091163320610019844965347283565770209660580060

[n_23]
n = 98732243816208344101089881999678229767787321192638126987232060022293171828538636055234082960150558855412662397028478679139916381771811220331027455874138797444723547224197063212061534351867173190141857439152581327894215440861514666659083641573712750230406234166746981657633453579555223087777388017141219863357
c = 79986503981752061258794042676693178586447029502359747048023111795992934365242244682829429272390068037057046062309761327773405090718654650720076028550805109733579396054684907361299816676563364626187567013130090336496213340846195056940882865823569179892482289906651517251337945983544365258393137860454629191034

[n_24]
n = 66758615137661898183681497955843604169028345085237805715333905865679489166485605837900352165193227372176156053590485930024553737196112154396746107966369020635666402637798447666072855759885530955274895416566724028133310359697187795915845310925062676192985370829461872593411469634758531178728570607504146151183
c = 13644517609019773891752530242094138831866235873125487109230786665109164395091721313937951226156892649251285129063094039490320017705224680296595835191486830050938538995037990589408100435630167986445442337761819350654576053224334692633242984280988119041485629348514778490701297689672789712907641785978089412539

[n_25]
n = 98072970158130557052743501309214730278183672382038608367394969864230458326809973544699153818591268662881322072888566398106950485297090504826503492694322913234760076993549505099324874666504871151866005427564471382493910187132163914206317057765492519429766575635686245134324011521395693486543919737121504564927
c = 84756677608503103260150955220616338703818320766559408023672186987294916281780991760578014562370308440828277618587258867132040493620801006697405228609133125079705806759032776671611044403011814257753860020429845202992660681078110288265705662308669257914929820557756911758703795881131111105735456426318361668270

[n_26]
n = 116998704975451649126438110873632899254005035277419492670572774767081897262579095726695238650572133502662066827419600650735798245588760283654510477447046866555500946271925294552225210668772639370759673964276976644621482337217991637452069794612545466451954965844946653644526046333919159857735087230405950562681
c = 16570430676458274583658783537202109532681933818735984083525092301573135300505599596210770719561152272430146209359937832679805615289403307183767153773810188203253348072362271474889040363373962217099743034143761290094400088428924419758901967319662412728935236729324324147218380946513393582503111366654276667293

[n_27]
n = 104483514647872589681750539956059559501518691095588994886613956985450502398886043160024956236709333777575620090527433151049744446098751309566470308420565126337409330093064263594492981235416010482005033230034168756644048683563312430985576767247522190417485746094089079663154364989197924484966033401666051619461
c = 17138394314732282449650222032375481084037945506331562281807984251337618581384768104426297000629054857160015466800107548208795134907834277028686324230052715882695049480511887100966333344409478092633916061816340887546660275109537469955682428550280514161676149871928697674125785900970509982522705961063870834979

[n_28]
n = 60326311910614696264262112650793534842739976803535002683648803579454544386266984856609414251042150402068441298005137860375797409795047626918641940955705868295020454501701371277588656888843053973492594235436982999278079509091708430758975557632443310088336913237484287616197147486615344814109811864250769004891
c = 40931200129536119129644931618257632169934594051909344741491940855917398274021060980770502436016419647550890030028556565161699377570124309757732051413125103970861589757309665980307809346218599682322773838935146655136803291714871322334463226028263300731552065334923055486898110113638267225092777539580967661120

[n_29]
n = 108836390011321379014926001958164364243680734136242582915858471735873222003767956934494616082247251743183741337629538507775710288933884908999105367830098149342315322613209423119780437542382162620154890855931342295730861455417298653702685900413828888060663557808749461673663629805867833592897786982342788685959
c = 49860122961236087518368710991510422129175328759552404964767690481160371914478166882884455554939984467361034583020724163693277920013700619375425377163492358032319254013708661844879532008747012150391247862825829421307678519370594782114030222043646875943001632050368814409623938147284840384891087323572532883863

[n_30]
n = 147642880756826434444470720183242575623344222891343187543310266034660755092423898665133531987847110221083466801342989915260094925689296456102030850541466004189380905152669699297642719571249347617034459232200990669150472862070080313969604894517840202856938171221361517095307992345596936784648094656980792830737
c = 92046977118980127142442564723058804191280810807794300193233825843423814612407373128382214212045853881676642579345885635206419186329917252046488467399777210387100456331052575842560395399937360811919422210598686053566713013512136629612761288856067802758730356069125133284822316529263294450339705623303650541612

[n_31]
n = 87734299076255924714617453820106124696091797650891616195988933926991162457468764047182100622640315094106172533028675477160048861436573108179533405393174795226635752513805066563332520116258057939800258710771706500516267782437758245192511829394235482408496309979576773935406995172536715298363024533346069346919
c = 62263252640401475318960695726808441962295596142158429394863286841220955664537708906119183631769528596071399577496529459778311142738285615356820914043365948933560441123577579761404940981747532536111256739727969621195235958898220730142554231618489423211995414457014513373452869234957604252970221336539983340072

[n_32]
n = 95168052957135885178626832261117079804232648423544525965346024825603884658561493715838419742301304157918975962291479837488430639925193595425591944804055822094003524356965580798499990558645733777026207805801162417237439898941373631234499065453460277052468733038062179112857305187134332721434321449771799966573
c = 47308667329988014529087465185943989650815985557654501979569681083097603969644369844030771441444410365116209805852419087740629267083199189176509773861376488656519367590985625308828158263786736945484737339632978956191304127508915031525569292687193621113966999264598420351091041444022465263533009967538090104901

[n_33]
n = 114411145073433113022779564326722850591086774647782899300150137907486262370063613072378664891398298321559199031974310866181210363471975723911866777778770162784631257342290338755862113531477644766476067972283163711314795056112088840338525152673380207315640971316373676167796997813755391889570083582769555559103
c = 94422595978646242385370859519234185285716971843466907323230873050888720783302526415117935769832820271082589144616575676517436641168393833352590277574876283258301184156308459939216124860384928179670520210346849035173195626606754096834809440127939495539537902290299887617625681705583745256724318702438145962169

[n_34]
n = 95479078167944012555059510194535316700724634892833216872215244225865604624747266739645717141828585085019926083587368486910129688910884679317631716166480652140861382210591129454338475212950770552050475815284838056686348436934865994292725841850312050347693728526187676352510853618070377328882007450669852024067
c = 45982751479143673997045605834122952252425215373240723816593939944209409478475972946079190389743757924303865876514515981660955111210625161445971304646183507301105269006602145715411717298196867795684625232475162257873600441071166167581905690570819559110937048405959184291973185816886576321872073629520027933109

[n_35]
n = 104210978136595230891087798676367564823753206514856021196375425772745699072487908076016311602695745154349859462737817439238614793440776356373265528586980469884184707529198466626483692318329436310471573158231593900056091507816703811713617547371376944611174717451275120901898700134871914684744133375045083974559
c = 47795890018312771415042345069340623608208640670842813420097975422251308044096964274135251807688060722467290219083318980053947501924058955107468568628695877672501235831125177972779208595710594858788771405413808960375103289445718484753806431277618590577002568794014665029007522547246875640296273255471027746174

[n_36]
n = 124900226916008255291364823427932270688510422097938162661205956484918846565343556390509970236724043293296270349255397548674255755736775721401583808983028413293950374478174908210743176930820078213911296986905209176239030646665342756766665656798693942784289547500890598570625257574834144161908220090513607100443
c = 69687098984633733075280717007587203818312950246289738071141776045422637587297945727527258833596780023616592412869727844602694777579783707102049282895045427781576648624111949234897892934958565410274547056762375405558949445944961270752443153415695633314374042157534903100601349529735209374183246418467507261678

[n_37]
n = 106076461689740364509547983234550083419491598858439281865012707231490098640181388950259650519845227256038061169481367312244216059487641941663897149853760510043653747481760729965852665972680183551345973379645844201094479192927941808230165011051745283319434738229025415306651624552661593145968829146009528204139
c = 49265710428903305060640098658868900623042892220055083681800681636693217103754657961211688101393980802485486994767600500130501790099820636158227682077483275519434004553444062288968146281353744052370298988361041739971609762483097545691128944207477091466023637243001938492115731909427849297711486130876631104199

[n_38]
n = 102962829720771882197749256670336589357311132436261490004396772895006384277874667395420850357722988048941437978183999217447648123296439722730055980585935615891138197537072428082144801107174501380609741843220821085775200534747761633269518926910390413273344760450125150389251771046927241876033660426522558543099
c = 27781362665688824165016862953510332480542293818004472225574029238124263287391117238506191501951396870358266502368695220080425450119808769180065196569973906172552505849961213824318575099643862453287436796754580954469690531286909858759254426336535934955118131726082983730605020636892038993734701758861726813917

[n_39]
n = 73856953558568922866065269006785075537460094024399704360714920414994378603564606431481975815209474306251824674589466430959132648739341353797951609730777823223231201000238065040131404182984196612368806918632439249661194393025640075280971803068966303374536384766382205539061910067068706562997455112740019131141
c = 51915893879955490253802566958190047213763169433955095339957337049322539987200895203998502264798668768412922087182570714987156269462095705471944455611913005794278946564787522329048202985918435716894853328571194687387853787530720415846161416416757464376941214309484833893359116013087534027228501529765756907692

[n_40]
n = 65680214781438239555281960634195867835139324061180765322384486454047655097115706363891153450590534574351578810199984914495173275168206748586690680272761313448935092560918627591896139791469443972993979003054600865154011978228594047714049604578365127852096951779635039890953169546467866563266332296396871076589
c = 7684074671551210406583011634674519674891094232023770078592205024228244586008047726163330419380257939415877596490356539338012471983951869276015232840717439681128745977907088460407978913598847121925730554331272215687487501421132565249129743606275082527834357490648278977212010985656047607921255565470565331604

[n_41]
n = 63731094353225856606884846888435889685724323090116632497321440843471595699500046176243726442543427591048508993828354169603431232430905153081294636987864618130184112836258653457104912385524741899810300045949715807120033969791612530969664910145078555120597496861060797394280764831507105630414699914806363699919
c = 45135268640531572276632359436457117328448215496689754243654316877945919791435143715382831866291594843635227890263474174236403136140577883195807877658173635800169975109646931450935492786999735420639321517460515137029043381757277121855173814947251489703164764744842744697746009656927991552781411603984151236817

[n_42]
n = 131288746056753706799251297343925936986513850875832463509780227830988366933051206223718132326720614580110407529508692875317142679411579909002217250676078142722857601045944930987355779316969568475651902390173931010454505887209439626309636041213111385622305466557744171022716506877192050121646433129382313101053
c = 112744066328442409161417689589020315149280389883889756414854898060858251180276709990609763598732918496371494629320774504452520501164750402711455524435663355878780266124470139294032611326343529788023423464481785129539704566759175819861252326272870495129850959767518532226207699355915509845261433422668064158147

[n_43]
n = 83676921012282550512303401264397648068621964517656416739307673385591720719332838058073826239369638305284785180049541517570705412715000417863135734806873461343038931768632377619826665184183536387706749007414008584315847709894913964647923203871863375859788911666582003878412457638393407796910907877625937115293
c = 64587468728420247302224575709884332576098583790894153541573792923889723022503636857078795897100243385366764796448591906202736770145726218999885222971394680495632871056756158108672235623119200158547824537286862014033000125072082300400506630117043725123416611633573931158643343196531565638354716489675854822449

[n_44]
n = 107030054015087699139519262772728868842593238547433164775729464521772074966846794437736985617483484698270493657545913338804724099411820962705592272173516224837816744344065940618045323765453821555222713203802544489064777242962969716980534278888159088999349126513541701925962726046306864101299436162647297434849
c = 105657897857946314217340002015104160854509295690859274867843856620738133949061691607504418354926641487695855270865093071510546545157325232748207951711619993404044655007664070926272905377478256229789599520152039771250190159992066715349976543013222482138507293430051790459818256070324493596920250504795880801013

[n_45]
n = 89473794652379132450673026806587454714920435044408685254946255223602153698392388885033340513553464653246623093560821610679233365263890457633002483146981940013223156160837730360512137871272216866132440912611846386374771080980840088873686178469059518406894496503145465688024812930960266115229230274738114996907
c = 65689611094849937112329541757314052031835941448096718520497381987012868452392824902099096359643626573053399516769140077760976151549630064035406584674887819668758166204826846540515185341483274907623321234090042322119063963964305382759909537483616842515806481391952678240808768552058510774610984371734780693135

[n_46]
n = 97453692360221550525546414966397900446143894547459997755329830448432372475615815486408785701156413698241821262793738783053819570379326736532459084184732138260631432203066922896117238959614888101433738027706461797704480416144648360785799510836716769714953962723460387456296333189732562581166990547142363506233
c = 33635550655164661193638995161087233824832017512985967201561415707708251129505398124555900665283890455320975705071337975407119307598802379191658241415253018875624502985256581953036337649371555147642991393008112919449983360543682982510089879745240084291217521030993180089009138398930133055572314481548375172412

[n_47]
n = 72110261011813804504699995241414935772601482660021632643448029482979872141648770058130720101544649293432992047392229209697580021984291543006321973063581200375167771080297142162138791764150457087178800126398919417518959521113749708876779341492672187722724304490254491357939555861470434733012180727444930923711
c = 27594166134185673292363592371705253990545626708181652916737705612435409771022803185867850355650906370335020015065719532239190552005974543128258608957861843949502098170096407325140860639757639486519725463591773910637337455431143451699528477794467589689153369252137201751896811401565591147412597244703389010092

[n_48]
n = 78122884671752036823697231362017241332672680262948866914242750297148504000868567535547392055315438687741491499873398302755846466314188891158667604042463240341624935740684029682819183618539622686036495780663875201786101375514678349102491335468261470024752084648870531991551830780272898466768092280177114692051
c = 22421294177445342844160499123464996227038929743160143621730890990404785986808106034340459368178210170899299988065450550451758942626313068047256343624972594655208812912325260242531971656312318955715295109729219376623050265643900569431085543463502701600517143206557385630737929399092415306602699696571768302397

[n_49]
n = 84425100372667709081351008608369464999175296018000038343488754222958042215634556280629504014723615236854177488101190111656475845400206225964972957750342381863809504300134945714141421396891682378792869479733182762947319320452457491930448144300445164741177043099949953854515277259329681550088547132519052614231
c = 11025655521651977682718429833120705820173377364466496631786785538536423486092265951037906039713585670763817677532288222631142506222473954443053493542027582069138840121115002083588802596551797766632194064992504962798179294624494090093798337071872500931203935593175946389007083405285716384918518482594838109887

[n_50]
n = 76500928140557126951724082173424539634881305472817091417354118419682742078696556369663431631613049814066274893574795062996943022496494748474202712572097857610759669062349068368426767423023209350854968141894400035943508174837015387264409993545082627931903929574033492743333545979438362106170342782167687609107
c = 10835219926693744715226054600570675946129061939860372899995850870803848251070230139723433415534228479787886666269236646256799151316920754649873028710947833002154324632186309684272625729925386497641528810548192349048222027964237850335570477213388434897313533622929497500089961247597050651661308649384027755219

[n_51]
n = 139237837960035910646687916167915067040948209141509547478650946545607307041356395829646629075167578370050461042404793555835755850760066875641804762986083112195069377600306026177092911766398745954474513022700897756622714672037989763110412593587869199600384292944312268989774543301753778380746204072143177381803
c = 33504220411103363648905580410433029122727077829225905640294568048202031479149747901779756716491927386579457044024810462816601015130294414372912477229817100700909431649525437858242925058333428108411843766072343017163119495841041661379922012515769877839886403561438085220803145239403402362322100289480854215585

[n_52]
n = 117631254440827507711546516112064297632280517928701748229245100878457364480551737782926019390654343902604153923628235107328333591976094811034889142554408478459326139372839799039660101105089383957921866031073451602010280579418535870826966679607043782829521690182490405885737782400118120924577001573078069674031
c = 58081239962080289539906254360700159598142562988604931399068793477666166828020623753926759111646908772270036826511294547686391825720970410679855590857629934979655095269122503464951186999483445309422521312381301676116995685418231618433794023796701393350546134001033470765285941563129008503210305690581496989613

[n_53]
n = 87937561818584222067998501919046183164308258733624324874010371260128617446056888141283866305399209040799670381796495556537840654814799948322352233830362809817282857926530760795100851673538109675849767661695723939064163025995368930876760370213927885931816302820132430573906481238739384645306155356045085410659
c = 70353910119492561304997751595660997934725320689030790761785801693780450524401892515867067737335014549634402169552439412696800605971983092191032742128764098307531085732186961054924376068682626009181143856968718386364360024107286218381939928224582669724984430384091177413653359407965960659775462562437234176542

[n_54]
n = 121494135008171226375671409329837799191283088835966404651235988073098249092521541975067727645782080146180142892886721427393083831025060337427205569221607867816449951160262349064183736422019180025381395196798309104979993825520850704644518169879717439251166133025991744120758650078599372754647416364880517335673
c = 96124490139950046197016373711525737984644393252464916071851869765516581561747228879613155589524152632714927835422522664757276436023889445499893530783556896318087464112528679849958296550595124327514868543923634490018995647221618964810578099265174507171054978199076057090242189056855571075714794852616323545798

[n_55]
n = 104526292983815049511684831813997427004903214666645560631465142732200291577549994915017639978735111413930374038654975595174609015149778366007738397229835387841781838590394212639085516120474654389008329374807038730589684341972751119427397612411672615922118786971783836634736031219403320200067949470717779338699
c = 53525296179404140755501633385909663496959520446349532338066089655637364974852325384104814644355031090153086378349806439008060052338094942063965676095471089115562464095086347506474334963836939247782248394005049426530356395273840846631671561797842282022916588149878401628024484852733784293085112240910154188327

[n_56]
n = 137317704472567961216181080342613357343575313301339369342657385964502640491361208642059935501657870555419622774054072740316171355388149247371287529354566408424773867535596523666978660163095211923499777265022567776949469058056517042827298345927459607526976941723109800647277312883369595792063139258023975837323
c = 113303720867154494697852500357644759448043823219362027898143392679102317482970393914011078897636848470883059950298962408807140718310433138772483261345280554971368830760746668022060620713920854476565351976646576658923049862482014555499098631705043425687059066208849299248851416095337775423820369155501159322885

[n_57]
n = 88195122611127715769699993202074228583439275399074002854731620357451278444028076944142775479735846117716601737755557363184797776452112641709712005378691288474128773600382499559064846418256103597221189994815759855699913486538095356288852743114692590043927490813123669572257581364238195901785276389260789865577
c = 73913964009633261231270425260232709150784365614098258055822544831515941645318658499733846215504825273856158303254628879328745760493087406690893533322348155485834789131234721750985992230360872015187578363525697927380430712163230460426748704438119078872484248545612497001428621979782856261329367547781437976629

[n_58]
n = 99818788432853827881516435738813053368970948426449375954403696637675334637787416053431814853038810508431999771538465684659846469616047111372114534116658459641139992980128530170352284264767800326189782233782433221878169220672158257928668750240537006666128085602962938058892172209765765942353021078760030185953
c = 13143593421545568887272111055115063529148374173183820486709409035817442098891745344379522206872021223575649181389573652563084996604798774432746516486028875436504963657129584534966904738779978150886985100629429482621276787468248225822247548057804822190287563044474710257297044047778366621695067343076196963364

[n_59]
n = 89116440537082034096007339508627962600816125152708965763623147352128348135019671068361676714507097261410812750135368513250938490248291964104119444577610856094496131334052241221868309809334184247318379626902790295470783559999213894171508946361861330645509618787654875702411478298395052077750258286567341793673
c = 46410074528345591271442909354540876854983747019275858767049216344398136806600468114887380556148820491781335250695797126664473656392201988003467954211473291229046496035491477334797060560364990926679861729979254282749731190331996675678333827288202990981507079265543866951764809855339704853628775034741057210245

[n_60]
n = 107777234085847418525692492751498557116365112676157940027797787247873648173244311790872383690219654416683258064278214402849632274580082036604585774406256951125393538335600201926864361424362038357926057836205766070824072702981890703499274855005758838127054497428174443852066321749376198936319846090446587845901
c = 30873276784655415898639780220317531098555181267748494820177405042365602805037762075274253973737960788943466955887139873827151101823524617479202978233785328439836176883990904681050397810186146666852493436694647111407184239910266131828128455416702697371504649738803269763979849746334027096478051999140264274462

emmmmm !好多n啊,一共有307组n,c,找出隐藏的flag!

先从众多n中两两取GCD,利用找出的素数进行分解n。

1
2
3
4
5
6
7
8
9
10
p = set()

for i in range(len(n)):
for j in range(i + 1, len(n)):
if GCD(n[i], n[j]) != 1:
# print(f"n[{i}] = {n[i]}, n[{j}] = {n[j]}")
# print(f"c[{i}] = {c[i]}, c[{j}] = {c[j]}")
# print(f"GCD(n[{i}], n[{j}]) = {GCD(n[i], n[j])}")
p.add(GCD(n[i], n[j]))
print(p)

这里的n[0]的素因数被找到了。

1
2
3
4
5
6
7
8
9
10
11
p = 8966982846196321583218732818156212338929358106653027903288099594075033180211918114777730737751247653195936571427074856051307498770294940971178276714212171

q = n[0] // p
print(isPrime(p))
print(isPrime(q))

phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m = pow(c[0], d, n[0])
print(long_to_bytes(m))
# b'TGCTF{ExcePt10n4lY0u_Fl4gF0rY0u_555b0nus}'

分享一点正则表达式的技巧,像他给的文件不能直接放进python中用,一个一个改又很麻烦,就可以用ctrl+H启用正则表达式替换,然后再微调一下。

1
2
3
# "\[n_(\d+)\]" -> ""
# "\n\n\nn = " -> ")\n\nn.append("
# "\nc = " -> ")\nc.append("

tRwSiAns_

题目:

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 flag import FLAG
from Crypto.Util.number import getPrime, bytes_to_long
import hashlib

def generate_key(bits=512):
p = getPrime(bits)
q = getPrime(bits)
return p * q, 3


def hash(x):
return int(hashlib.md5(str(x).encode()).hexdigest(), 16)


def encrypt(m, n, e):
x1, x2 = 307, 7
c1 = pow(m + hash(x1), e, n)
c2 = pow(m + hash(x2), e, n)
return c1, c2


m = bytes_to_long(FLAG)
n, e = generate_key()
c1, c2 = encrypt(m, n, e)
print(f"n = {n}")
print(f"e = {e}")
print(f"c1 = {c1}")
print(f"c2 = {c2}")

n = 100885785256342169056765112203447042910886647238787490462506364977429519290706204521984596783537199842140535823208433284571495132415960381175163434675775328905396713032321690195499705998621049971024487732085874710868565606249892231863632731481840542506411757024315315311788336796336407286355303887021285839839
e = 3
c1 = 41973910895747673899187679417443865074160589754180118442365040608786257167532976519645413349472355652086604920132172274308809002827286937134629295632868623764934042989648498006706284984313078230848738989331579140105876643369041029438708179499450424414752031366276378743595588425043730563346092854896545408366
c2 = 41973912583926901518444642835111314526720967879172223986535984124576403651553273447618087600591347032422378272332279802860926604693828116337548053006928860031338938935746179912330961194768693506712533420818446672613053888256943921222915644107389736912059397747390472331492265060448066180414639931364582445814

用一下立方差公式,凑差值

1
2
3
4
5
6
c1 = pow(m + hash(307), 3, n)
c2 = pow(m + hash(7), 3, n)

c1 = m1^3
c2 = m2^3
c1 - c2 = (m1-m2)*(())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# from flag import FLAG
from Crypto.Util.number import *
import hashlib
import gmpy2

def hash(x):
return int(hashlib.md5(str(x).encode()).hexdigest(), 16)

n = 100885785256342169056765112203447042910886647238787490462506364977429519290706204521984596783537199842140535823208433284571495132415960381175163434675775328905396713032321690195499705998621049971024487732085874710868565606249892231863632731481840542506411757024315315311788336796336407286355303887021285839839
e = 3
c1 = 41973910895747673899187679417443865074160589754180118442365040608786257167532976519645413349472355652086604920132172274308809002827286937134629295632868623764934042989648498006706284984313078230848738989331579140105876643369041029438708179499450424414752031366276378743595588425043730563346092854896545408366
c2 = 41973912583926901518444642835111314526720967879172223986535984124576403651553273447618087600591347032422378272332279802860926604693828116337548053006928860031338938935746179912330961194768693506712533420818446672613053888256943921222915644107389736912059397747390472331492265060448066180414639931364582445814

d = hash(307) - hash(7) % n
x = (
(pow(c1 - c2, 1, n) * pow(d, -1, n) - pow(d, 2, n)) * inverse(3, n) + pow(d, 2, n)
) % n

print(gmpy2.iroot(x, 2))
m = gmpy2.iroot(x, 2)[0] - (hash(307) + hash(7)) // 2
print(long_to_bytes(m))
# b'TGCTF{RS4_Tw1nZ_d0You_th1nk_ItS_fun_2win?!!!1111111111}'

EZRSA

题目:

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
from secrets import flag, get_random_emojiiiiii
from Crypto.Util.number import *


def genarate_emojiiiiii_prime(nbits, base=0):
while True:
p = getPrime(base // 32 * 32) if base >= 3 else 0
for i in range(nbits // 8 // 4 - base // 32):
p = (p << 32) + get_random_emojiiiiii() # 猜一猜
if isPrime(p):
return p


m = bytes_to_long(flag.encode()+ "".join([long_to_bytes(get_random_emojiiiiii()).decode() for _ in range(5)]).encode())
p = genarate_emojiiiiii_prime(512, 224)
q = genarate_emojiiiiii_prime(512)

n = p * q
e = "💯"
c = pow(m, bytes_to_long(e.encode()), n)

print("p0 =", long_to_bytes(p % 2 ** 256).decode())
print("n =", n)
print("c =", c)
# p0 = 😘😾😂😋😶😾😳😷
# n = 156583691355552921614631145152732482393176197132995684056861057354110068341462353935267384379058316405283253737394317838367413343764593681931500132616527754658531492837010737718142600521325345568856010357221012237243808583944390972551218281979735678709596942275013178851539514928075449007568871314257800372579
# c = 47047259652272336203165844654641527951135794808396961300275905227499051240355966018762052339199047708940870407974724853429554168419302817757183570945811400049095628907115694231183403596602759249583523605700220530849961163557032168735648835975899744556626132330921576826526953069435718888223260480397802737401



解释一下emoji素数的生成,第一个参数是素数总位数,第二个参数是用getPrime生成的位数,例如这个p就是高224位用getPrime,剩下的用emoji,q就是全用emoji。

一个emoji有32位,所以p就是getPrime(224)<<224+9个emoji,q则是16个emoji。

题目给出了p低位(8个emoji),那就可以考虑coppersmith攻击。(其实我感觉q全都是emoji也有弱点,可能有非预期解)

用这个脚本测试一下发现8个emoji算不出来,9个emoji就可以。

1
2
3
4
5
6
7
8
9
from Crypto.Util.number import getPrime
p = getPrime(int(512))
q = getPrime(int(512))
n = p * q
test_bits = 224
p_h = p >> test_bits
R.<x> = PolynomialRing(Zmod(n))
f = (p_h << test_bits) + x
f.small_roots(2**test_bits,0.4)

因为emoji范围是u1F601 - u1F64F,不难爆破。

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
from Crypto.Util.number import *

n = 156583691355552921614631145152732482393176197132995684056861057354110068341462353935267384379058316405283253737394317838367413343764593681931500132616527754658531492837010737718142600521325345568856010357221012237243808583944390972551218281979735678709596942275013178851539514928075449007568871314257800372579
c = 47047259652272336203165844654641527951135794808396961300275905227499051240355966018762052339199047708940870407974724853429554168419302817757183570945811400049095628907115694231183403596602759249583523605700220530849961163557032168735648835975899744556626132330921576826526953069435718888223260480397802737401

bit = 288

for code_point in range(0x1F600, 0x1F64F + 1):
emoji = chr(code_point)
p0 = emoji + "😘😾😂😋😶😾😳😷"
low_p = bytes_to_long(p0.encode())

R.<x> = PolynomialRing(Zmod(n), implementation='NTL')
f = x * 2^bit + low_p
roots = f.monic().small_roots(X=2^224, beta=0.4)

if roots:
print("Found: ")
p = int(roots[0] * 2^bit + low_p)
q = n // p
assert p * q == n
print(f"p = {p}")
print(f"q = {q}")
break
else:
print("Fail")

'''
Found:
p = 12424840247075830662687097292458444573014198016321428995092662043898159667123240573630892907827505266982898641483333170032514244713840745287869771915696311
q = 12602471198163266643743702664647336358595911975665358584258749238146841559843060594842063473155049870396568542257767865369797827796765830093256146584311989
'''

然后发现e与phi不互素,但公因数不大,分别是3和5,先分开各自求解m,再用CRT方法合并。

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 *
import gmpy2

def part_roots(n, c, e, p):
# 将e约简到可逆,g为余下的因数
def div_e(e, p):
g = GCD(e, (p - 1))
while GCD(e, (p - 1)) != 1:
e //= GCD(e, (p - 1))
g *= GCD(e, (p - 1))
return e, g

# 约简e,便于开根
e, g = div_e(e, p)
d = inverse(e, p - 1)
M = pow(c, d, p)

# 在有限域内开根
R.<x> = Zmod(p)[]
f = x ^ g - M
return [int(i[0]) for i in f.monic().roots()]

n = 156583691355552921614631145152732482393176197132995684056861057354110068341462353935267384379058316405283253737394317838367413343764593681931500132616527754658531492837010737718142600521325345568856010357221012237243808583944390972551218281979735678709596942275013178851539514928075449007568871314257800372579
c = 47047259652272336203165844654641527951135794808396961300275905227499051240355966018762052339199047708940870407974724853429554168419302817757183570945811400049095628907115694231183403596602759249583523605700220530849961163557032168735648835975899744556626132330921576826526953069435718888223260480397802737401

p = 12424840247075830662687097292458444573014198016321428995092662043898159667123240573630892907827505266982898641483333170032514244713840745287869771915696311
q = 12602471198163266643743702664647336358595911975665358584258749238146841559843060594842063473155049870396568542257767865369797827796765830093256146584311989

e = "💯"
e = bytes_to_long(e.encode())

res1 = part_roots(n, c, e, p)
res2 = part_roots(n, c, e, q)

for i in res1:
for j in res2:
m = crt([i, j], [p, q])
# print(long_to_bytes(m))
try:
print(long_to_bytes(m).decode())
except:
pass

如果不解码的话,会变成这个样子,刚开始还以为错了,检查半天,从一堆乱码中瞅见了TGCTF{

解码是这样:TGCTF{🙇🏮🤟_🫡🫡🫡_🚩🚩🚩}😃😖😘😨😢