首页
社区
课程
招聘
[分享] KCTF2022签到题
发表于: 2022-5-12 00:57 2510

[分享] KCTF2022签到题

2022-5-12 00:57
2510

所用工具:IDA,x32dbg
0) 打开程序之后,观察界面。输入附带的Name和序列号点击检查按钮即可获得success!提示。由此将断点下到获取文本的函数处,然后再进行分析。

 

1)在x32dbg中运行程序,查看调用的模块和导入函数,可以找到GetDlgItemTextA();然后在该处下断点。
图片描述

 

2)F9运行程序,然后输入题目给的用户名和序列号。观察序列号的生成规则。

 

一、点击检查后,程序运行到断点,可以看到断点处的函数有两个GetDlgItemTextA()函数,分别获取两个文本框的文字。
图片描述
然后向后浏览一遍指令,大概有200多行,而且其中又有关键的提示是否成功的字符串,所以这就是我们要找的加密函数了。200多行汇编代码准备用IDA打开静态分析,发现IDA中在401450处的关键函数竟然不能反汇编。没办法只能分析200多行汇编代码了。
图片描述

 

二、回到x32dbg,从断点处继续F8运行代码。
获取到输入的文本之后,会立即进行长度的判断,判断用户名的长度是否为0,序列号的长度是否为0xE,也就是序列号必须14位长度。[ebp-3A0]是序列号长度。
图片描述
然后继续F8, 来到了4014E5处,初步猜测从这里开始加密,
图片描述
图片描述
4034AD函数执行完之后,会看待EAX中返回了一个数字04BC
图片描述
继续F8,
图片描述
但是,两个框中间多了一个比较,[413000]与0比较,这里先不管,继续F8,
图片描述
然后,继续F8之前,可以观察到这个函数返回了一个数值F0D285BA,
图片描述
先不管这个F0D285BA,继续F8,
图片描述
如大家所见,紫框中的函数是取序列号的前10位,通过观察输入的值以及输出的值就可以明白,不同的是,这里将不是将序列号的前10位返回,而是将前十位放入[ebp-30]中。
图片描述
(图片描述的有点错误,40354C函数是将Name算得的F0D285BA,0xA,和一块地址引用作为传入值)
继续F8之前,看看后面还剩多少代码,毕竟Name和序列号都处理完成了,剩下的就是比较了。发现还有60行左右。
经过分析,剩下的汇编大概意思就是判断40354C函数计算得到的结果是否和输入的结果一致了。但是程序并没有逐字节判断两者是否相等,而是采用了一个新的方式,逐两字节判断是否相等,直到遇到'0x00'结束判断,判断结束以后,判断[ebp-3A4]中的值是否为零而断定输入的序列号是否正确。
图片描述

 

3)在进行下一步之前,我们大体知道了加密大概是,取序列号后四位计算得到一个值,送入另一个函数。然后通过计算Name得到一个值,将这个值继续处理得到一个10位序列号,将此序列号与输入的序列号的前10位比较,相等则破解成功。
输入要破解的Name,KCTF,序列号随便输入一个14为长度的数值“12341234123412”。
重新运行x32dbg。输入之后点击检查。从断点处继续运行函数。
首先取后四位,计算得到一个结果,送入4017E0。然后继续,发现出问题了,后面的代码跟第一遍不一样了。
图片描述
对比IDA发现巧合的是,IDA恰巧在此处无法正常汇编。
图片描述
所以断定,这个地方与后四位有关系,只有正确的后四位才能得到正确得到运行。

 

然后从新运行程序,将序列号改成后四位为1212。继续运行发现程序完全没有问题了。

 

4)接下来就是分析算法了,首先看计算Name的算法汇编有点复杂,看看IDA中能不能反汇编。
图片描述
发现IDA中确实可以反汇编,汇编出的代码也挺复杂,大概是,首先初始化一个向量,然后利用这个向量和逐字节计算结果。
图片描述
然后得到5EE54F4C,然后就是取输入序列号的前10位,然后是到了40354C函数,去IDA里面找该函数,发现是__ultoa()函数,进制转换函数。
图片描述
根据输入的另一个参数0xA,可知这里是将5EE54F4C转换成10进制,与输入的序列号比较。
打开计算器,输入5EE54F4C,得到十进制数字,也就是序列号的前十位,1592086348
图片描述
最后再串接上后四位得到,实际序列号15920863481212
序列号生成算法 s = H(Name)||1212
其中H()由401260函数实现该算法


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//