HITCON2022--ctf驱动逆向题

作者:selph

HITCON CTF 2022 Writeup-checker

挺有意思的一道题,这里的关键函数是使用的动态生成执行操作,按照特定参数序列进行解密才能正常执行,否则一定会报错异常

checker

一共给了两个文件:checker.exe和checker_drv.sys

是一道驱动逆向的题,查壳,无壳,有签名的Windows 10 x64驱动

先看用户程序checker.exe:

 

逻辑很简单,就是打开符号链接发送IRP请求,控制码是0x222080,没有输入参数,接收1个字节的输出

接下来看驱动程序checker_drv.sys:

DriverEntry里面就这么一个函数,进来后,可以看到,先是创建驱动对象和符号链接,然后填充IRP处理函数

接下来往全局变量里填充了映射的内存地址,

•qword_140013170:里的是dword_140003000函数地址

•addr_140003030_qword:里的是dword_140003000+48数组地址

•qword_140013188:里的是sub_140001430函数地址

•qword_140013180:里的是sub_140001B30函数地址

最后就是一系列异或操作:

 

对qword_140013180里头的前16字节异或了两轮,使用的是qword_140013188里的前32字节的内容

qword_140013180地址的内容:

 

qword_140013188地址的内容:

 

可以看到这两个地址都是函数,这里用一个函数去异或另一个函数emmm

这大概是某种保护手段,阻碍静态分析,真正的函数是运行中动态生成的(实测,异或这两轮的结果并不是可执行的代码)

之前用户程序里看到,传入给驱动了一个控制码,这里到驱动里去看看这个控制码的作用:

 

 

除了这个控制码,上面还有8个控制码,等会再看

当用户传入0x222080的时候,驱动进入这个分支,如果数组byte_140013190里的8个值均为1,则会跳转到LABEL_21,很显然,这里验证的内容是dword_140003000的开头是否是hitcon,这说明这里会出现flag

byte_140013190的值是在哪里改变的呢?往上看:

 

上面的其他8个控制码分支,分别修改该数组的每一位为1,同时也会执行一个相同的处理函数(参数不同)

随便点进去一个看看:

首先是进行了对刚刚那个函数的又一轮异或操作,异或的值取决于函数的参数

然后对qword_140013170地址,也就是dword_140003000数组里的值进行修改,一共修改48个字节,修改方式是调用sub_140001B30函数(被异或了好几轮的那个)

 

 

最后再次异或一轮

整理一下思路:

•flag的生成,是在函数中通过调用一个奇怪的东西sub_140001B30生成出来的

•flag是否完成生产的判定是,是否走完了其他8个控制码的处理分支

那么是不是只需要依次把这8个函数都调用一遍,生成出来的内容就是flag了呢?经测试,根本执行不了,直接报错地址异常,应该是函数异或出来的东西就不是可执行的内容,在Windows 10 x64虚拟机上安装驱动实测则会蓝屏崩溃

这里我卡住了,感觉很接近了,但就是总差一点

休息了一下突然意识到,有没有可能是这8次函数调用的顺序问题?如果程序一定能执行成功的话,就一定能一个一个把8个函数执行出结果

于是经过一番倒腾测试,发现执行一个函数,只有最后一个函数能执行下去,能行,一定是顺序问题,经过又一番测试,得到最终测试顺序,

flag生成:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极安御信安全研究院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值