先拿提供的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
第一次发这种帖子~有什么不足的欢迎各位师傅指出~
还有就是感谢梦游枪手师傅耐心的指导 ~~