KCTF从入门到实战(九)- 杯弓蛇影
简介
大家好! 我们又见面了! 继《传家之宝》和《南充茶坊》之后,这一次我们奉上实战系列作品——《杯弓蛇影》
故事背景简介
春夏秋冬,寒来暑往,日复一日,这人间循环往复空换时光流逝,似乎少了点乐趣。
无所事事便没有好事。
不知从哪儿传出的“巳蛇将出”的谣言,传说巳蛇亦蛇亦弓,入水为蛇,踪迹全无,出水为弓,毙敌百步。竟也有人捕风捉影、信以为真,一传十,十传百,事实变得更加扑朔迷离,人心惶惶。
遂智者言,地势坤、风入松、松如浪,一景一画皆有其意,善用者,良马也。
脱壳
使用的反调试:异常,硬件断点检测,内存检验,NtQueryInformationProcess,简单的反dump等。这些反调试有的会造成导入表加密,有的会使代码段错乱,造成异常,有的会修改算法,需要找出所有的并且绕过这些反调试。
内存校验数据选择放在了 紧跟在DOS头后得无效数据
清楚掉所有的反调试后
导入表保护:清除了源程序的导入表,使用了iat混淆,你需要修复导入表
VM识别解析
模拟存储识别:
1. 代码空间
Code用于模拟在一开始new出来
1. 代码标识 CD 8字节
2.代码sizeof 8字节
2.代码大小 8字节
进行拷贝赋值
2. 环境寄存器[9]
unsigned long long ER[9];//9个计算机环境寄存器 初始化的事后使用
#define TE 0 //Text End
#define HS 1 //Heap Start
#define HE 2 //Heap End
#define SS 3 //Stack Start
#define TOP 4 //Stack End
//3个指针寄存器
#define IP 5 //指令指针 (指令运行后必然使用 ER[5])
#define SP 6 //栈指针
#define FP 7 //过程调用帧栈指针
...
3. 寄存器[10];
类型 unsigned long long
寄存器[1] - 寄存器[9]
GR[1] - GR[9]
指令解析:
ps:(有些操作会随着SetProperty属性更改而进行修改)
例子strlen:
二进制解析CODE
指令混淆识别:
1.非混淆代码会 与外界交互
2.前面会执行多个pushd 指令 popd指令结束
算法破解
此题使用了一种面向多明文的数据对称加密算法
该算法能够对同一个密文,使用相同的计算过程,在不同的密钥作用下,得出既定的不同明文。
该算法能够为“必须在不同环境下表现出不同功能的程序设计”提供一种安全的实现方案。只有拥有合适密钥才能解出理想代码,否则不仅看不到理想代码,甚至不能确定所谓的理想代码是否真的存在。
为了符合参赛出题要求,我们将‘一批密钥’和‘每个密钥应该解出什么样的明文’固定在了CrackMe里面(我们认为,就算公开了),还将解密算法固定在了CrackMe里面(我们认为也算公开了),然后要求攻击者给出正确的密文,即:序列号(实际上是在挑战攻击者找出正确的加密算法)
密码算法描述
假设给定一组密钥masterkey[i]和一组对应的明文m[i]
明文预处理
0x01
对输入的n个明文m[i](i=1,2,...,n)均填充到等长长度且为L的倍数,令结果为m_p[i](L为分组密码中分组的长度,本题L为32bit)
即:填充到长度为ceil(maxlen(m[1],m[2],…,m[n])/L)*L;其中ceil()函数返回不小于给定数字的最小整数
0x02
对填充后的m_p[i]分别采用Hash算法(本题选用的是SHA-256),分别得到m_h[i];
0x03
m_p[i]分别循环地与m_h[i]异或,生成m_hp[i];
0x04
将m_hp[i]分别与m_h[i]拼接,得到m_hpd[i];
0x05
将m_hpd[i]分别以Lbit为分组长度进行分组(此题L为32bit)
m_hpd[i]=m_hpd[i][0] || m_hpd[i][1] || ... || m_hpd[i][length/L] (length为每个明文m_hpd[i]的长度)
密钥预处理
0x01
随机生成salt(每个salt的长度为Lbit)
0x02
将n个salt分别连接在n个密钥口令masterkey[i]后面得到k[i]
0x03
对k[i]进行Hash生成key[i](此题选用的是SHA-256)
0x04
对key[i]分别以Lbit为分组长度进行分组(此题L为32bit)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-4-28 00:50
被xh1998编辑
,原因: