看雪CTF 2017 比赛进行至第七题
截止至今天中午12点,第七题破解人数为16人!
攻击方排名前十名变动较大,比赛排名有人升、有人降。
loudy上升4位,从第十升到第5位!
EricAzche也升到第7位,
本题过后,又一位新面孔冲进前十,kkHAIKE
谁会获得最终的大奖呢?最后的前十名又是谁呢?
期待ing......
接下来我们来回顾一下第六题
看看 看雪评委和出题者是怎么说的ヾ(๑╹◡╹)ノ"。
此题作者采用了多种反调试手段给攻击方增加了不少难度。通过int3 异常触发程序执行流程;通过TLS对OEP进行异或加密;通过对部分函数进行加密,让其以SMC动态解码的方式执行来保护函数不被调试分析;通过对程序进行自效验的方式,防止被篡改。算法上采用约瑟夫环变形处理。此题难在考察攻方选手绕过反调试的能力。
作者不问年少,本名蒋超。毕业于西南交大计算机系,现在铁路行业任数据库系统工程师。爱好计算机编程(熟悉C/c++/Basic等语言)、电影、游戏、逆向分析、跑步、象棋等。2008年左右接触看雪,我认识了很多朋友,谢谢你们的帮助,让我不断成长,也学到了很多新的知识!
注册码说明:原注册码为 bwns@pediy!后来根据要求全改为字母加数字,连空格都去掉了!
现注册码为:BwnsAtPediy2017KX9Ok
注册成功截图:
制作思路:
来源于约瑟夫环的变形处理。将一张码表看成一个圈,取用户输入的字符在码表中的下标。然后从此字符的下一字符处开始移动其下标值/5+5(这样做为了大幅度减少循环次数),然后取对应的字符,对此字符进行高5位低3位移位操作后,取其HEX字符进行验证。
验证方式为对每个字符的ASCII值/4的商,余数比较。(可由此进行注册码的反推。)
其他处理:
1、在Button中进行了特殊处理,使用int3异常开始游戏,必须触发异常,否则就退出了。
2、用TLS对OEP进行异或解密。
3、使用了SMC对显示对话框解码,解码的KEY即为用户输入的字符。此处用了try-catch包裹,故输入不正确的key不会崩溃。
4、StartGame函数也进行了 SMC 加密,运行时解密,完成后再加密。
5、对EXE加入简单自校验,使用MapFileCheckSum(测试发现此处360会误报木马),若发现改动,直接退出。
6、SMC均采用IDA直接查看地址后精确处理,无其它标记,制作稍麻烦。
关键代码:
序言:
本题采用TLS、SMC等反调试、反分析手段,算法为索引一个64字节“环”匹中密文再进行加密和隐藏比较,并利用注册码进行SMC解码,想爆破都不容易!本题算法和防护手段都算上乘之作,无奈碰到了大神而饮恨。
本文是在提交答案之后重新写的,假设输入答案:BwnsAtPediy2017KX9Ok,节省笔墨纸砚,努力把文章写好。
//首先查壳,Microsoft Linker(14.0)[EXE32],OD加载直接运行,OEP停不下来,噶么鬼?
//检查PE格式发现TLS
//勾选SOD插件“Break On Tls”,重新加载,跟踪40C120 TLS函数,看看都做了什么小动作
//加载停在了40C120
//使用6字节密钥“EB 74 58 CC E8 75”分别异或OEP入口0xC8字节代码,还原并清除了OD自动设置的OEP断点,所以载入就跑飞了。
//接下来对代码段设置内存访问断点,几次运行后就能断到OEP
//断点 bp GetDlgItemTextA,输入注册码,单击“开始验证”
//断下来之后,返回主程序
//用“PEDIY”作为密钥,解密426字节,对应“CALL 00411B30”所需要的主算法程序
//处理前
//处理后
//继续跟踪主程序
//断点410558,断下后单步跟进 CALL 00411B30
//Array1:(用户输入与0xCC异或后)
Array2:(64字节)
//在Array2环中索引查询结果
//Array3:
//对Array3再次异或、移位、与等加密,结果还是更新到Array3中
//加密后的Array3
//返回主程序
//加密“CALL 00411B30”对应主算法流程的426字节,主算法程序加密掉,理念不错,用完弃之!
//CHECK,跟进 CALL 00411825
//检验Array3是否满足,如果不满足就不进行后续SMC解码
//再跟进 CALL 00411975
//Array3 未转换之前:
//索引表,字符串、十六进制转换:
//Array3转为字符串Array4 "A30B1B828ABB4A9BA9BB93AAA36B82AA024AB243"
//确定输入位数20位,这里才能达到80(0x50),异或后为0才能触发跳转
//目的是为了将Array4每个字母作为十六进制数进行除以4,取商和余数变形,阻止破解者轻易理解算法,藏得好辛苦,作者辛苦了!
//下记录断点,查看40组变形结果
//找到要比较的表,必须相同
//正确值
//Array4校验值
//算法破解思路:
//根据40位校验值按“4的倍数+余数”,求出40个字符Array4,然后转Array3,再进行20位字符串,逐位穷举,限定合法字符
分析关键CHECK的SMC解码程序(隐含注册码筛选要求)
//返回到上级程序,分析后续SMC过程
//申请内存4096字节,用于SMC,这种方法可取,防止爆破和静态分析
//待解码数据拷贝
//源:
//目的:
//SMC解码,异或
//1、根据40位校验值按“4的倍数+余数”,求出40个字符Array4,然后转Array3,再进行20位字符串,逐位穷举,限定合法字符
//Python
//穷举合法字符注册码如下:第1、3、11、19位只有唯一解,而其他位都存在好几个解,为了进一步筛选注册码,需要分析SMC解码
//2、根据SMC解码,结合对反汇编代码的认知进行推理,在待选注册码范围中人工筛选出最终答案:(作者你也太狠了吧,呵呵)
//对不确定的第7、8位手工验证,最多4次:
//当输入第2组:BwnsAtPediy2017KX9Ok 弹出信息成功提示“Well Done!:)”
//当输入第4组:BwnsAtiediy2017KX9Ok 弹出空白信息提示,确定后退出程序
//因此最终答案为:BwnsAtPediy2017KX9Ok
//SMC代码最终解密结果:
//调用SMC执行,跟进
//SMC最终反汇编
//使用MessageBoxA显示成功信息
这个作品的设计理念上乘,尤其结合SMC有效防止爆破,有实际应用价值。假如算法和反调试、反分析再做加强,得分还能提高!
最后感谢 WiFi 万能钥匙安全应急响应中心的赞助支持,
接下来的比赛大家一定要使出洪荒之力哦!↖(^ω^)↗
比心 ❤
上海连尚网络科技有限公司成立于
2013 年,是一家专注于提供免费上网和内容服务的移动互联网企业。连尚网络自主研发的核心产品 WiFi
万能钥匙,以分享经济的模式,通过云计算和大数据技术,利用热点主人分享的闲置WiFi资源,为用户提供免费、稳定、安全的上网服务,以帮助更多的人上网,找到属于他们的机会,改变自己的命运。
往期热门内容推荐
更多比赛详情,长按下方二维码,“关注看雪学院公众号”查看!
看雪论坛:http://bbs.pediy.com/
微信公众号 ID:ikanxue
微博:看雪安全
商务合作:[email protected]