X-NUCA(牛咖)联赛8月逆向专题赛赛前--驱动分析破解的解题思路

发表于:2016-08-22 15:30:00 来源:  合天网安实验室 阅读数(0人)

给了一个 32 位的有问题的驱动


很快定位到问题:




修补如下:




这里修补还有 2 个坑点:


1. 驱动加载是会算校验和的,所以需要用 loadpe 修改。 (这点刚好知道)


2. 这儿修补时,还需要修改此处代码对应的重定位表。


分析 unload 函数,发现需要 p 不为 0




寻找对 p 赋值的地方:在 IRG_MJ_CREATE 的分派函数中。此外还需要满足请求进程的


pid==360(这点很难办到,看了下对程序后面逻辑没有影响,直接 patch 修改)。






另外,写了个代码触发执行 IRG_MJ_CREATE




#define PAGE_SIZE 0x1000


#define OBJ_CASE_INSENSITIVE 0x00000040


#define FILE_OPEN_IF 0x00000003


#define KERNEL_NAME_LENGTH 0x0D


//main 函数


int main()


{


HANDLE DeviceHandle=NULL;


ULONG ReturnLength = 0;


PVOID MappedBase=NULL;


ULONG DllCharacteristics = DONT_RESOLVE_DLL_REFERENCES;


ULONG ShellCodeSize = PAGE_SIZE;


char DeviceName[] = "\\\\.\\360Dst";


HANDLE handle = CreateFile(DeviceName, GENERIC_READ|GENERIC_WRITE,


FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);


if(handle == INVALID_HANDLE_VALUE)


{


vprintf("CreateFile error:%d\n", GetLastError());v

}


else


{


printf("CreateFile succ\n");


}


return 0;


}


后面就没什么了,在 unload 的对应函数返回处下断,查看那几块内存,有一个地方对


应的就是 flag。


相关新闻

大家都在学

课程详情

SQL注入之绕过is_numeric过滤

课程详情

Zabbix_SQL注入漏洞分析

课程详情

逆向之CTF