首页
社区
课程
招聘
[原创]看雪CTF2016(第五题)
2016-11-12 10:04 2543

[原创]看雪CTF2016(第五题)

2016-11-12 10:04
2543
看雪CTF2016-第五题

1.        分析过程
题目下载后直接运行后没有任何提示,于是夹在od调试器,也没有任何反调试,于是开始尝试对GetWindowText,GetDlgItemTexT等函数设置端点,也没有断下来,于是猜测是通过控件关联变量或者发送消息的形式来读取输入字符。于是加载到IDA中进行分析。
打开IDA后逻辑也比较清晰,WinMain函数中,通过DialogBoxParamA加载对话框。在DialogFunc中就是核心的代码。

在核心函数中当LPARAM参数扥估273,而WPARAM参数等于0x3EA时候进入读取输入数据函数。通过SenMessage发送消息读取。

在读取完数据后数据长度保存在V6中,而读取数据内容保存在V18中,首先检查输入数据长度是否是位于0x30-0x39中,这说明序列号只是又数字构成的。然后又检查输入数据长度是否等于6.如果都满足则继续往下执行。
接着来到sub_401000这个核心的函数中。该函数伪代码如下:

在该函数中刚开始计算是通过类似RC4的计算方法,首先初始化一个256个字节大小的序列,并以此初始化为0x00-0xFF,然后通过输入的key将序列进行移位和变换。移位算法描述如下:
for i from 0 to 255
    S[i]:=i
endfor
j:=0
for i from 0 to 255
    j:=(j+S[i]+key[k mod keylength]) mod 256
    swap values of S[i] and S[j]
endfor
其实就是RC4的第一步。
然后移位变换完成后,又进行第二部操作,主要是和固定数值进行抑或操作。

异或操作是通过将移位序列第一位和最后一位相加,然后第二位和倒数第二位相加,这样依次递退,并将相加后的值和一个固定128位长度的数组byte_406030的各个位依次进行异或。
该函数计算完成后,则到了下一个函数核心比较函数,sub_4010c0函数中,在该函数中主要是进行校验操作。

该函数主要通过将函数sub_401000函数中计算得到的byte_406030中128个数据进行逐字节相加,不过这里相加时主要保留了低WORD个数值内容,而对进位信息进行了省略。如果伪代码不清楚,可以查看汇编。

然后将计算记过和固定值10617进行比较,如果相等则返回1,否则返回0.
最后该函数返回后则是比较判断,如果该函数执行成功返回为1,

则会跳转到刚才解密后的byte_406030中去执行,该函数执行后显示congratuations 信息。因此如果这里没有输入正确的序列号而采用暴力破解的话,则会导致代码解密不正确而无法继续执行。
2.        程序破解
分析完成后,过程还是比较清晰的,但是这里刚开始想通过逆算法来找到正确的输入密码,但是进一步分析后发现在最后一步进行128次循环相加的时候,由于只保留的相加的低WORD字的内容,而高位进位信息丢失,因此是无法通过逆运算回去的。考虑到输入全是数字,而且还只有6位,算法既然也很简单,那么直接写个程序暴力破解,分分钟求解出答案。我猜想该题目作者也是想考察暴力破解的方法。
最后得到答案为771535.具体过程和逻辑请看word文档和破解源代码。

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

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回