看雪CTF 2017 比赛进行至第八题
截止至今天中午12点,第八题破解人数为5人!
攻击方排名前十名波动不大,
loudy从第十位上升至第7位,
poyoten再次冲进前十位~
前十名能否保守住自己的位置呢?
是否会有黑马一战成名呢?
期待ing......
接下来我们来回顾一下第八题
看看 看雪评委和出题者是怎么说的ヾ(๑╹◡╹)ノ"。
该题亮点依然在反调试上,用虚拟机进行代码保护,通过线程动态加解密主要代码,通过校验和检查代码完整性,根据时间来反调试,另外还将实际代码替换为假代码,防止反汇编,在反调试方面让攻方选手举步维艰。算法上采用了RSA算法的思想,解决掉反调试后,参考RSA算法可以求解。
作者loudy,原名吴林峰,毕业于北京航空航天大学电子信息工程专业,当前从事工作出于保密规定暂不公开。爱好跑步、篮球、电影;热衷编程、特别是逆向分析。2007年接触看雪,以潜水学习为主,也希望多认识有相同爱好的朋友。
一、答案
UFdVXVRTVVFYWltdXV9XQkFDQEUtLVBTV1BWVVFQUVxeWVxfWENDQkRCQE5CTEBCWFZaVVRTVlxZU1lcXC0tVGhpNV9pc19BX1ZlcnlfU2ltcGxlX1Rlc3Qh
二、基本设计思想
(1)简单虚拟机(使用虚拟寄存器传值)
实现了系统函数调用、CMP、JNZ、XOR等调用
(2)反调试
主要使用了3种
1、 线程动态加密解密主要代码
2、 CheckSum检查主要代码
3、 时间判断
(3)反汇编
主要通过将实际代码替换为假代码,防止反汇编。
(4)算法设计
主要是利用RSA思想,其中(比较小)
P:900F0CA3041C345B
Q:98FCAE63A170C363
N:56172073862A662A8D6BB1A135999031
E:D9C382944A461EE3
D:4A064A97921BDF9E3F354E9020AE054F
首先对输入进行base64解码,然后将解码后注册码分成三段,
1、 第一段解码得到E,再和固定值做大数乘法运算,结果和另一固定值比较,相等则到下一步
2、 第二段解码得到N,再和固定值做大数乘法运算,结果和另一固定值比较,相等则到下一步
3、 通过E和N对第三段加密,和内存固定值比较,相等则成功
三、破解思路
1、先解决反调试和反反汇编,将真正代码还原
2、识别大数乘法运算,通过固定值和大数除法还原E、N,得到第一段和第二段注册码。
3、通过E、N解出D
4、用N和D对固定值解密,得到第三段注册码。
5、组合三段注册码,base64加密,得到最终的注册码。
创建了6个线程, 前3个线程是负责smc解码的, 后3个线程没用
线程1:解码 004025DC 处的跳转及 check1 函数
线程2:解码 0040263C 处的跳转及 check2 函数
线程3:解码 0040269C 处的跳转及 check3 函数
一个自定义的虚拟机
校验函数
检测代码改动
sn=base64_decode(sn)
sn的格式(共90位): (20位)--(39位)--(27位)
校验前20位
(sn1 xor abcdefg...) * 98765432109876543210123 == 1549780652036258484424751705102781884386113
校验中间39位