首页
社区
课程
招聘
[原创]看雪CTF2016--十八题的破解流程
发表于: 2016-12-7 15:48 3059

[原创]看雪CTF2016--十八题的破解流程

2016-12-7 15:48
3059
今天终于有空把破文写下,其他的一部分也会补上
该样本没有用反调试手段,所以直接就可以冲着算法去
首先,找到GetDlgItemText下断点得到输入的数据,下面就是验证函数1120,如下图


接着看下MessageBox看到,其是在另一个验证函数13B0中的调的,我们再看回1120中发现并没有分支到达这里,这就值得我们注意,然后打开ida看下引用发现其是放在异常处理中的,那思路就清楚了

作者的验证算法分2段,前面部分验证完后制造异常进入异常处理接着验证,最终如果验证成功则弹框显示
接下来的工作就是找到异常处理了,我们看到1111地址这里是个除法,这就值得注意是不是会产生除零异常呢,我们用OD产生一下试下,果不其然调用了异常函数,如下图
这个跳转手动改为je

ecx手动改为0

到达异常处理


而前面9个字节就是运算后产生除零异常用,所以我们可以把前9个字节做个筛选算法找到解的集合
样本算法首先为和9个字节常量做异或然后减去一个0x41运算,然后再看结果是否为下标从0到8是递增关系,最后再将这些值统一算个乘法等于0xD4C2086就会除法除0异常
附件中附上了我的筛选算法,算出有3个解的集合,分别为pediy2016,qejjy2016,qgeiy2016
选个比较顺眼的"pediy2016"进入异常处理内部
发现这里做了不少混淆,我们可以借助内存断点来辅助我们输入数据测试,发现地址3ABD是验证长度的必须是20个字节,如下图
ecx是输入字符长度,edx是验证长度

然后又发现下标9-13位必须是cool1(在3D1F处验证),那整个注册码就缺七位了,我们可以hook整个代码来穷举后面6位了,穷举算法我放在dll里面
我是在开头加载dll,如下图

然后1349地址的call换成jmp,跳到我的处理穷举函数这里,如下图



最后弹框验证成功, 531223


PS:附件中为筛选算法cpp,编译下跑下前9位的集合就出来了,有3个满足条件的解
pediy2016cool1531223验证成功

[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 10314
活跃值: (3157)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
2
图片没传成功 麻烦重新编辑一下
实在不行就打包DOC上传附件
2016-12-7 20:57
0
雪    币: 180
活跃值: (82)
能力值: ( LV12,RANK:443 )
在线值:
发帖
回帖
粉丝
3
我这个是草稿...不好意思,群主
作业有点多,我这时候再整理下
2016-12-7 21:40
0
游客
登录 | 注册 方可回帖
返回
//