2020年腾讯游戏安全大赛PC端初赛
0x1 RING3 扫雷
先用PE查exe的text段偏移地址,然后加0x1da dump出内存
然后用开头特征码去dump文件里再dump出来
0x2 脚本对比
对比一下改了什么
可以发现原本是一个inc 自加
猜测是时间自加,全部nop后,就使用了咋瓦鲁多(时停)
第二个是点到雷之后结束,这里改成jmp跳过,直接无敌
0x3 RING0
先用Unicorn_PE(github)把文件dump出来,然后分析,注意在win7 x64上运行
代码除了基本的通信,其他功能反汇编出来了。
进入第一个关键函数,百度搜了这些api作用就是查找键项里有没有key键值为1
驱动成功加载
0x4 输出hello world
搜索字符串找到,发现是KeWaitForMutexObject等待前面的事件进入信号态,往前跟
发现就是外面这个函数进入了判断,同时看见上面的Event,原来如此
写一个驱动改变一下输出helloworld
0x5 代码
#include <ntddk.h>
VOID SetEvent() {
UNICODE_STRING EventName = { 0 };
HANDLE EventHandle = NULL;
RtlInitUnicodeString(&EventName, L"\\BaseNamedObjects\\tp2020");
PRKEVENT pEvent = IoCreateNotificationEvent(&EventName, &EventHandle);
if (!pEvent)
{
DbgPrint("Set Faile\n");
}
KeSetEvent(pEvent, 0, FALSE);
}
VOID DriverUnload(PDRIVER_OBJECT Driver) {
DbgPrint("驱动已经卸载");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT Driver, PUNICODE_STRING pReg) {
DbgPrint("驱动已经加载");
SetEvent();
Driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
0x6 总结
感谢战队的 Qfrost!!!q神指导我!!
放一个q神博客(滑稽)http://www.qfrost.com/
学习到了很多函数,api和工具。