大家好,我是刚刚学习逆向的草鸡子.
今天我要分析的是南京势胜开发的U号租上号器的驱动sysx。
0x1:
sysx使用了Safengine 2.4加的外壳,稍微提一下现在还是挺少看到这个壳了,支持国产壳。
在初始化阶段,sysx先是直接创建\Device\sys的设备。然后打开\Driver\i8042prt和\Driver\Kbdhid设备为后面的模拟鼠标点击,键盘输入做准备,接着注册进程,线程,DLL回调。枚举是否有"snr.exe"进程,解析ntdll等等,。 我们根据设备找到派遣函数就
sysx为我们提供了非常多的功能,比如MouseClassServiceCallback模拟鼠标,KeyboardClassServiceCallback模拟键盘
读取物理内存
还有连招三件套,Alloc,Write,Create
使用导出的ZwCreateThreadEx创建线程(如果有的话..)
Attach上去直接申请内存
Attach直接读内存
还有的就是一些不是那么有趣的功能函数了,检测进程,获取模块信息,遍历堆栈等等。
0x2: 这场残暴的欢愉,终将以残暴终结.
在sysx的写内存接口中,并没有验证目标地址的正确性,于是就出现了任意地址写入漏洞,通过控制目标指针,我们就可以写到任何想写的地方去。
加上Safengine外壳的缘故,整个text段都是处于可写的状态
这使得利用变得更加简单和稳定。
.text节的空隙高达0x12b0个字节,第一阶段我们首先将context部署到sysx + 0x153D50的空隙部分。
第二阶段修改任意一个dispatch的call指令使其跳转到空隙context上, 我选的是sysx + 0x103D9
第三阶段执行通讯的iocontrol,触发context。
那么我们开始吧。水之呼吸拾之型生生流转
0x3:
首先编写一个payload.sys,很简单就输出几句话,编译的时候设置入口点为DriverEntry。然后编译为payload.sys做测试使用,此时的payload.sys是没有签名不能被系统加载的。
然后我们必须先获取到ntoskrnl.exe和sysx.sys的基址,然后手动把ntoskrnl.exe和payload.sys内存加载到内存中。
我们接着构造一段context用来在内核中分配并保存我们的payload.sys后再执行入口点
由于我们已经知道了ntoskrnl的基址,先动态修复payload的导入表,注意偏移量我们是算的当前真正内核的地址,而不是现在映射的地址。
接着打开sys设备
写内存的接口如下,进程写自己的就可以的,内核空间是所有进程通用的。
然后第一阶段,先拷贝context进.text的空隙
第二阶段,修改CALL指令转向为.text空隙
第三阶段,触发context
完美成功。
代码和BIN都在附件,有不对的地方还请大家指出。
相关代码与驱动文件
sysx.cpp
payload.c
payload.sys
sysx.sys
One comment
这个图熟悉!!!1