首页
社区
课程
招聘
[推荐]看雪·安恒 2020 KCTF 春季赛 | 第四题设计思路及解析
发表于: 2020-4-23 17:12 5948

[推荐]看雪·安恒 2020 KCTF 春季赛 | 第四题设计思路及解析

2020-4-23 17:12
5948



第四题《西西弗斯的滚石》历时4天,已于今天中午12点关闭攻击通道。那么目前赛况如何呢?攻击方的排名如下:




已经开放赛题的5支防守方队伍排名如下:




此题共有2541人围观,最终无人揭开西西弗斯的谜底,看来出题者设计巧妙,此题破解难度大,那么你想知道谜底究竟是什么吗?一起来看看解析吧。



小编点评


总体而言质量挺高的一题,实现了一套代码变换和解释执行的系统 (作者称之为原生虚拟机),至少工作量很足,最后还公开代码也体现了出题人的诚意。


SMC 部分在 2018 年题目的基础上加强不少,加入了把解密后代码加密回去以及覆写栈空间的行为,而在循环中修改下一次循环的指令更显巧妙。


但是美中不足之处在于程序过于臃肿庞大,执行速度太慢,有些影响参赛选手的比赛体验。






出题团队简介




本题出题战队 䨻䴎蟗䵻鬮匶䬟㼖龘虪 :



团队简介:计算机技术爱好者。从几年前只懂C语言的小白,到现在庞大计算机世界的初窥门径,感谢论坛十几年如一日的为广大安全爱好者提供交流学习的平台。






设计说明


1、基本说明



题目类型:WindowsX64 Reverse


模式Ⅱ


参赛团队:䨻䴎蟗䵻鬮匶䬟㼖龘虪


这题是上次出的一道题(https://bbs.pediy.com/thread-247772.htm)的全面升级版,上次的题写的比较随意,但最终也只有5个人做出来。这次重新设计了代码结构,再放出来让dalao们试试。




2、设计思路



根据上次攻击方的wp,做了以下的改进:


1、整个shellcode全由自己的代码生成(上次的是对编译器生成的机器码进行修改),所以还想利用ida的f5?不存在的。


2、上次的题每条指令只会执行一次,smc自解密后并未再加密回去,所以有了跑一遍再DUMP下来这种"投机取巧"的做法。这次的题所有的指令都位于一个大循环内,每次解密后执行完都会再加密回去。每个CodeBlock里都嵌套了3层的smc。


3、取消了聊胜于无的反调试小trick。


4、添加了指令修改功能,每个codeblock运行时都会随机选择其他两个codeblock的指令进行修改,注意到这时其他codeblock的数据是处于加密状态的。所以这既使得每次循环执行的指令都有不同,也防止了破解者直接把codeblock自解密后的原始指令dump出来。


5、以上其实都不是重点,重点是shellcode生成方式。


本题的shellcode实质上是一个x64架构下的原生虚拟机。(原生的含义是直接使用x64架构中的指令,而不是在其之上再封装一层wrapper)。



虚拟机的指令集:adc,add,and,bswap,bt,btc,btr,bts,dec,inc,jmp,lea,mov,neg,not,or,pop,push,rcl,rcr,rol,ror,sal,sar,sbb,shl,shr,sub,xchg,xor

虚拟机的数据区:

寄存器:

rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12,r13,r14,r15

栈:

进入虚拟机时rsp低地址处的50个qword。

状态寄存器:cf

栈指针:rsp

虚拟机的5种数据类型:

"pwd":变换中的密码数据

"const":与输入无关的常量

"stackptr":指向栈区的指针

"codeptr":指向代码区的指针

"uc":不确定



输入的密码hexdecode后由rcx,rdx表示,传入虚拟机进行可逆运算,运算结束后仍然由rcx,rdx传出,和用户名比较,相等则成功。

 


3、解题思路


1、维护一个Context结构,结构里存储了虚拟机的数据区的数据(包括数据类型和数据本身)


2、解析出执行的每一条指令的ins,imm,operand,按照ins,imm,和operand的不同情况更新Context结构(也就是模拟执行)。说起来一句话的事实际写起来很麻烦,比如我就分类讨论写了将近100个指令类。(如果会用unicorn说不定能使问题简单很多,但我不太会 :<)


3.模拟执行的过程中遇到pwd类型的数据,将其运算过程记录到文件。整个模拟执行过程完成之后,这个文件记录的就是简化的正向的对pwd的运算过程,吧这个对Pwd的操作反过来再逆回去就可以得到此题的注册机。




4、PS



1、虽然这题个人感觉已经挺难的了,但是实际在难度和复杂度上还有很多的提升空间,比如增加外部函数的调用,执行完后抹去数据再换一块地址copy过去。写这题写了10多天,先写这么多,如果还是被dalao轻松破解(not likely?),下次再加上。


2、严格来说这题并不算混淆,没有什么constant blinging或者花指令之类的东西,如果裁判觉得有必要,可以找我公开源码。


3、附件内的public是向攻击方选手公开的文件,内有crackme和公开的一组注册码,secret里有一份我整理出来注册机,可以对任意的用户名生成密码,还有此题正确的flag。(附件下载戳这里:https://bbs.pediy.com/thread-258262.htm



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-5-19 13:46 被Editor编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//