首页
社区
课程
招聘
[原创]2020KCTF
发表于: 2020-4-14 10:50 6670

[原创]2020KCTF

2020-4-14 10:50
6670

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编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 430
活跃值: (69)
能力值: ( LV3,RANK:34 )
在线值:
发帖
回帖
粉丝
2

因为发现bug所以申请换题。新版与旧版保护方法不变,序列号答案不变。

上传的附件:
2020-4-28 01:15
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
xh1998 因为发现bug所以申请换题。新版与旧版保护方法不变,序列号答案不变。
已更新并群通知大家了。
2020-4-28 02:36
0
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
mark
2020-5-6 06:08
0
游客
登录 | 注册 方可回帖
返回
//