点击此处获得更好的阅读体验
WriteUp来源
题目考点
解题思路
1.程序框架
通过TLS回调函数对程序关键加密函数进行SMC自解码,用户输入字符串,通过关键加密函数加密后与字符串比对。
2.关键加密函数
通过SMC自解密后可以查看
类似base64的重组位之后查表,同时另一个线程对表进简单的换表操作,线程同步进行。
(base表被简单加密隐藏)
3.反调试
静态反调试:几处花指令。
动态反调试:CheckRemoteDebuggerPresent
3.三个TLS回调函数
进入程序有三个TLS回调函数:
TlsCallBack_0
这两个函数都加了花指令。其中SMC自解码过程
TlsCallBack_1
TlsCallBack_2
4.两个子线程:
子线程1,对 假flag 进行初次加密 得到比较字符串。
子线程2,先对程序中的一串数据进行加密后得到base表,再与主线程进行线程同步换表,且第一次换表在前。(这个线程加了花指令)
其实base表解密之后就是标准的base64码表,不过下面要变换一下。
5.进入主函数
关键函数内部,因为添加花指令,循环调用关键加密函数 的部分缺失。
对SMC自解码代码解密 脚本
IDA中 IDC对SMC自解码代码解密 脚本
1 | //IDA中 IDC对SMC自解码代码解密 脚本 |
或者手动对PE文件中的节区(节区名:‘.cyzcc’)数据进行解密。(解密之后的代码也添加了花指令,需要去除一下)
代码解密之后
这部分关键代码,就是对字节的位进行一个重组,之后查表,换一次表加密数据一次。
6.脚本
编程语言:c
,编译环境:vc++6.0
1 | //table数组就是被加密隐藏的base表,得事先对一串数据解密后得到,我这里直接解密后贴过来了。 |