2020年kctf春季赛 - 第二题 子鼠开天
2020-04-19 06:47:09 Author: bbs.pediy.com(查看原文) 阅读量:322 收藏

[原创]2020年kctf春季赛 - 第二题 子鼠开天

1天前 43

[原创]2020年kctf春季赛 - 第二题 子鼠开天

先拿提供的name和sn跑一下程序。

 

查壳:

 

无壳,32位程序 直接拉ida里面分析

找到main函数直接分析

 

输入了name和sn 判断了一下sn的长度 要求是64位,然后关键函数就是sub_401380

 

大致逻辑应该是先校验了一下name和sn的长度,然后sn通过sub_401000计算出来v9,v9通过sub_4010F0计算出来v10,v10通过sub_401210计算出来v5 后面 v6 v7应该是v5的属性应为并没有看到有对其赋值,所以v5可能是一个结构体或者数组。

判断else里面是正确的 sub_401190用到了name和nameLength v4应该是个结果 所以 sub_401190可能是对name做操作的函数,在下面就是用v4的值和v8的值比较 根据上面的分析 v8应该也是v5的某个属性,

所以猜测逻辑 就是  长度校验  校验完了一堆处理

V8 = sn 3次处理之后的值

V4=name 处理之后的值

然后判断 如果成功 就通过了。。

现在就需要对sn处理的三个函数sub_401000 sub_4010F0 sub_401210 和 对name处理的sub_401190 做函数分析。

对数据的加密解密是有一些开源库的  我们先看一下 字符串特征 看看有没有见过的开源库~

 

字符串中有包括这种的,所以我们找一下 openssl 0.9.8的版本 做一下sig.

载入OpenSSL的sig之后 我们会发现解析了一些函数

 

现在就需要一个函数一个函数去分析了

第一个函数:sub_401000

 

可以根据经验和动态调试分析出这个函数是就是把sn字符串转换成了16进制的数组(经验是别的师傅的 动态调试是我的~

第二个函数:sub_4010F0 双击进去我们发现我们之前加载的sig识别出来一个函数

 

网上搜索 AES_ecb_encrypt openssl我们发现 最后一个参数a6 是用来 判断 加密还是解密的 如果是 a6=1 是加密  =0是解密

第三个函数:sub_401210

 

 

 

这样字符串 上网搜一搜  发现这是第三方大数库的东西 也是在openssl里面的  我们还看到了 0x10001   上面的v10应该是个Key 从此处不难推出这是一个rsa算法

4.sub_401190

 

这个听说是一个tea算法 但是我们不用解 直接调用这个函数 拿着数据 回推一步步加密就能拿到sn了

那么开始回推

1.先拿到最后加密出来的结果

2.rsa加密

3.aes加密

4.结果

1.直接ida动态调试 拿到最后加密出来的结果

 

直接下断 然后输入官方给的sn 和 KCTF 来获取到KCTF的加密后的值

 

14 AF 58 AD 4D 76 D5 9D 8D 21 71 FF B4 CA 22 31

2.rsa加密  从上面分析得知sub_401210的V10是个key  应该就是n   0x10001应该就是e  所以我们要求出d

 

直接拉网站上分解N

47722 871591 096725 757997 518891 734102 017424 753321 232253 627204 800066 229728 054329 (77 digits) =

201 522792 635114 097998 567775 554303 915819 (39 digits) × 236 811285 547763 449711 675622 888914 229291 (39 digits)

然后算出来D = 25800220689750035710081482091841722516499776007453536839839657556744187750333

在算密文的时候 我发现一个问题 就是在

 

这个地方 v6 v7 v8都是v5的属性,v8只是v5的一部分 而不是v5的全部 所以我们不能直接用v8来做加密,应该还缺少了一部分

既然这个算法是rsa了 那么v5应该是一个char[]数字 我们把类型转换一下会发现

 

原来的v8变成了 v5[16] 所以这个判断只是用到了 v5的后半部分  我们需要在加密之前把前半部分补上

为了方便起见 我们直接用原来的sn算出来的结果 补一下就好了

最后计算 密文的python代码:

    rsa_e = 0x10001

    rsa_d = 25800220689750035710081482091841722516499776007453536839839657556744187750333

    rsa_mod = 0x69823028577465AB3991DF045146F91D556DEE8870845D8EE1CD3CF77E4A0C39

    result = pow(0x00025D343CED2E5A3CD5FE94CEA1570014AF58AD4D76D59D8D2171FFB4CA2231,rsa_d, rsa_mod)

    print(hex(result))

结果是:0x12a1758c9a9aace82bdfa5ed5190debc0caf522f2785e92e6cacbc6b0e3220b3

3.aes加密  

我们直接动态调试 把sub_4010F0 最后一个参数从0改成1即可  最后获得结果是:6ED8BC1F04D0C360567FB579398265FEEC8B48DC4B804904FEB1AB538C823270

 

第一次发这种帖子~有什么不足的欢迎各位师傅指出~

 还有就是感谢梦游枪手师傅耐心的指导 ~~

[求职]想求职找工作,请来看雪招聘投递简历!


文章来源: https://bbs.pediy.com/thread-258933.htm
如有侵权请联系:admin#unsafe.sh