-
-
[推荐]看雪·安恒 2020 KCTF 春季赛 | 第四题设计思路及解析
-
发表于: 2020-4-23 17:12 5968
-
第四题《西西弗斯的滚石》历时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)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)