首页
社区
课程
招聘
[原创]KCTF春季赛CTF2 writeup——keygenme
2020-4-18 23:50 3799

[原创]KCTF春季赛CTF2 writeup——keygenme

2020-4-18 23:50
3799

1. PE检测

使用krypt插件可检测出加密算法。

2. IDA流程分析

题目的流程非常清晰,纯考验对加密算法的理解。

 

使用IDA查看strings时,有显示调用openSSL 0.9.8zh。另外用findcrypt插件也可以检测到算法常数。

 

.rdata:0041B4C0 00000015 C .\crypto\bn\bn_ctx.c

 

.rdata:0041B4D8 0000002E C Big Number part of OpenSSL 0.9.8zh 3 Dec 2015

 

Address Rules file Name String Value

 

.text:004080F8 global MD5_Constants_4080F8 $c4 '\x01#Eg'

 

.text:004080FF global MD5_Constants_4080FF $c5 '\x89\xab\xcd\xef'

 

.text:00408106 global MD5_Constants_408106 $c6 '\xfe\xdc\xba\x98'

 

.text:0040810D global MD5_Constants_40810D $c7 'vT2\x10'

 

.text:004081AE global MD5_Constants_4081AE $c9 'x\xa4j\xd7'

 

.rdata:0041911C global SHA512_Constants_41911C $c1 '\x98/\x8aB'

 

.rdata:00419124 global SHA512_Constants_419124 $c3 '\x91D7q'

 

.rdata:0041912C global SHA512_Constants_41912C $c5 '\xcf\xfb\xc0\xb5'

 

.rdata:00419134 global SHA512_Constants_419134 $c7 '\xa5\xdb\xb5\xe9'

 

.rdata:00419118 global SHA512_Constants_419118 $c9 '"\xae(\xd7'

 

.rdata:00419398 global RijnDael_AES_419398 $c0 '\xa5cc\xc6\x84||\xf8'

 

.rdata:0041B398 global RijnDael_AES_LONG_inv_41B398 $c0 'R\tj\xd506\xa58\xbf@\xa3\x9e\x81\xf3\xd7\xfb|\xe39\x82\x9b/\xff\x874\x8eCD\xc4\xde\xe9\xcb'

 

.data:0041D030 global TEA_DELTA_41D030 $c0 '\xb9y7\x9e'

 

结合参数位置即可将对应算法进行识别。

 

主要的check在sub_401380中,涵盖了三个加密函数AES_4010F0、RSA_401210及SHA512_401190。

3. OD跟踪分析

输入给定数据进行跟踪。

 

NAME:B1AC71D22D82EBB1

 

SN:1788bdf0f45ff24515cfb9313f6519039c24c635ee518afc320b915ecdbf1613

 

首先进行AES的计算,密钥为128bit,最后一个参数0判断为加密,具体找openssl中的aes代码应该能找出对应函数。假定0为加密,则1就为解密,加解密是相对应的。

 

AES_4010F0((int)&SNHex, 32, (int)&cipher, (int)key_4190D0, 128, 0)

 

运行数据如下:

 

msg

 

0019FDAC 17 88 BD F0 F4 5F F2 45 15 CF B9 31 3F 65 19 03 ....._.E...1?e..

 

0019FDBC 9C 24 C6 35 EE 51 8A FC 32 0B 91 5E CD BF 16 13 .$.5.Q..2..^....

 

key

 

004190D0 48 0B 62 C3 AC D6 C8 A3 6B 18 D9 E9 06 CD 90 D2 H.b.....k.......

 

cipher

 

0019FDCC 13 98 18 82 F9 F8 B8 23 38 7C 6E F9 D5 00 9E 9F .......#8|n.....

 

0019FDDC 01 67 5D 5A 37 19 A4 46 96 33 6E 63 9F CD 27 78 .g]Z7..F.3nc..'x

 

接下来对cipher进行RSA加密

 

n:

 

47722871591096725757997518891734102017424753321232253627204800066229728054329

 

e = 0x10001

 

c = cipher^e mod n

 

0019FD8C 00 02 5D 34 3C ED 2E 5A 3C D5 FE 94 CE A1 57 00 ..]4<..Z<.....W.

 

0019FD9C B8 D7 72 5F 77 15 A6 A5 47 A2 BF 0E 83 73 70 5E ..r_w...G....sp^

 

对NAME进行SHA512计算,但查看结果只有16字节,判断SHA512为修改后的代码,只是其初始值没有改变,这里不对算法的具体实现进行分析,只看其执行结果。(其实这里的描述并不严禁,只称hash)

 

sha512(B1AC71D22D82EBB1)

 

0019FD7C B8 D7 72 5F 77 15 A6 A5 47 A2 BF 0E 83 73 70 5E

 

最终比较时,将该结果同c的后16字节进行比较。

 

0019FD7C B8 D7 72 5F 77 15 A6 A5 47 A2 BF 0E 83 73 70 5E

 

0019FD8C 00 02 5D 34 3C ED 2E 5A 3C D5 FE 94 CE A1 57 00 ..]4<..Z<.....W.

 

0019FD9C B8 D7 72 5F 77 15 A6 A5 47 A2 BF 0E 83 73 70 5E ..r_w...G....sp^

4. SN求解

首先求解RSA算法的私钥d,可通过yafu进行分解,或是在线网站进行分解。N很快能得到分解结果,用rsa-tool直接求得私钥d。

 

factor(0x69823028577465AB3991DF045146F91D556DEE8870845D8EE1CD3CF77E4A0C39)

 

n: 47722871591096725757997518891734102017424753321232253627204800066229728054329

 

p: 201522792635114097998567775554303915819

 

q: 236811285547763449711675622888914229291

 

d: 25800220689750035710081482091841722516499776007453536839839657556744187750333

 

接下来求取KCTF的16字节hash值(sub_401190),构造RSA加密后的c_new。(因为这里只比较后16字节,我这里直接沿用了示例中计算出的前16字节,这应该是设计的一个bug,有可能会造成多解,懒得修改测试了)

 

sha512(KCTF) = 0019FD7C 14 AF 58 AD 4D 76 D5 9D 8D 21 71 FF B4 CA 22 31

 

c:

 

00 02 5D 34 3C ED 2E 5A 3C D5 FE 94 CE A1 57 00 ..]4<..Z<.....W.

 

B8 D7 72 5F 77 15 A6 A5 47 A2 BF 0E 83 73 70 5E ..r_w...G....sp^

 

改为:

 

c_new:

 

00 02 5D 34 3C ED 2E 5A 3C D5 FE 94 CE A1 57 00 ..]4<..Z<.....W.

 

14 AF 58 AD 4D 76 D5 9D 8D 21 71 FF B4 CA 22 31 ..r_w...G....sp^

 

C_new = 0x25D343CED2E5A3CD5FE94CEA1570014AF58AD4D76D59D8D2171FFB4CA2231
n = 47722871591096725757997518891734102017424753321232253627204800066229728054329
d = 25800220689750035710081482091841722516499776007453536839839657556744187750333

plain = pow(C_new, d , n)
print(plain)
print(hex(plain))

得解:

 

8426904946924945457957113410387907728844146281038329727247159155573983944883

 

0x12a1758c9a9aace82bdfa5ed5190debc0caf522f2785e92e6cacbc6b0e3220b3L

 

以12a1758c9a9aace82bdfa5ed5190debc0caf522f2785e92e6cacbc6b0e3220b3为输入的SN,在keygeme中调用调用函数AES_4010F0时,将最后一位参数0改为1,查看加解密结果:

 

0019FDCC 6E D8 BC 1F 04 D0 C3 60 56 7F B5 79 39 82 65 FE n......`V..y9.e.

 

0019FDDC EC 8B 48 DC 4B 80 49 04 FE B1 AB 53 8C 82 32 70 ..H.K.I....S..2p

 

最终

 

NAME:KCTF

 

SN: 6ED8BC1F04D0C360567FB579398265FEEC8B48DC4B804904FEB1AB538C823270

 

作为输入,验证通过。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回