大家好,我是刚刚学习逆向的草鸡子.

841912_RG6H5C6CGJB4DMY.png

今天我要分析的是南京势胜开发的U号租上号器的驱动sysx。

841912_VGP64HTJQAV5FEA.png

0x1:

sysx使用了Safengine 2.4加的外壳,稍微提一下现在还是挺少看到这个壳了,支持国产壳。

841912_FX2UWV6Z4G9DTEE.png

在初始化阶段,sysx先是直接创建\Device\sys的设备。然后打开\Driver\i8042prt和\Driver\Kbdhid设备为后面的模拟鼠标点击,键盘输入做准备,接着注册进程,线程,DLL回调。枚举是否有"snr.exe"进程,解析ntdll等等,。 我们根据设备找到派遣函数就

841912_MM3Z473NU2N656U.png

sysx为我们提供了非常多的功能,比如MouseClassServiceCallback模拟鼠标,KeyboardClassServiceCallback模拟键盘

841912_EU5JVVN86FKQSGR.png
841912_W5423CWBHQ9XQKY.png

读取物理内存

841912_GFD5FNMS2QBVC4P.png
841912_FXF6JF7VPDRC4XD.png

还有连招三件套,Alloc,Write,Create

841912_ZZF3VNSZKBEXQUV.png

使用导出的ZwCreateThreadEx创建线程(如果有的话..)

841912_PR26WUV5BE8Z9VH.png

Attach上去直接申请内存

841912_VAG2H29YKHC8TEP.png

Attach直接读内存

841912_EZ2C4R4N3XHJFGY.png

还有的就是一些不是那么有趣的功能函数了,检测进程,获取模块信息,遍历堆栈等等。

0x2: 这场残暴的欢愉,终将以残暴终结.

841912_WU5GDJ7P8M7W6N6.png

在sysx的写内存接口中,并没有验证目标地址的正确性,于是就出现了任意地址写入漏洞,通过控制目标指针,我们就可以写到任何想写的地方去。

加上Safengine外壳的缘故,整个text段都是处于可写的状态

841912_UF4FNFSM2FJPXKE.png

这使得利用变得更加简单和稳定。

.text节的空隙高达0x12b0个字节,第一阶段我们首先将context部署到sysx + 0x153D50的空隙部分。

841912_763E5YPAYB9Q5VN.png

第二阶段修改任意一个dispatch的call指令使其跳转到空隙context上, 我选的是sysx + 0x103D9

841912_8TAVURGJY7U2AT2.png

第三阶段执行通讯的iocontrol,触发context。

那么我们开始吧。水之呼吸拾之型生生流转

841912_F2MW2SKMXMABJ44.png

0x3:

首先编写一个payload.sys,很简单就输出几句话,编译的时候设置入口点为DriverEntry。然后编译为payload.sys做测试使用,此时的payload.sys是没有签名不能被系统加载的。

841912_CUNEHAMAUVCX4W4.png

然后我们必须先获取到ntoskrnl.exe和sysx.sys的基址,然后手动把ntoskrnl.exe和payload.sys内存加载到内存中。

841912_GF4UUF2XKH8GYFH.png
841912_KSHNKUUMYGTCJK9.png

我们接着构造一段context用来在内核中分配并保存我们的payload.sys后再执行入口点

841912_5KSPCG8QAQ4BAK8.png

由于我们已经知道了ntoskrnl的基址,先动态修复payload的导入表,注意偏移量我们是算的当前真正内核的地址,而不是现在映射的地址。

841912_28735PZ6XYX7M69.png

接着打开sys设备

841912_F59B3GQ5EK7WBYT.png

写内存的接口如下,进程写自己的就可以的,内核空间是所有进程通用的。

841912_G9NYB6S5YU3GCAU.png

然后第一阶段,先拷贝context进.text的空隙

841912_RWFGQ4YR2UUGXRF.png

第二阶段,修改CALL指令转向为.text空隙

841912_GQGJNMXC4EBQE7E.png

第三阶段,触发context

841912_HBCUXRKFWUVJAVK.png

完美成功。

841912_3WRAUUYUVQUR6TN.png

代码和BIN都在附件,有不对的地方还请大家指出。

相关代码与驱动文件

sysx.cpp
payload.c
payload.sys
sysx.sys

本文转载于https://bbs.pediy.com/thread-269166.htm

Last modification:September 2, 2021
如果觉得我的文章对你有用,请随意赞赏