-
-
[旧帖]
[原创]IIS8 HTTP.sys漏洞 深入分析
0.00雪花
-
发表于:
2015-4-29 11:02
8704
-
[旧帖] [原创]IIS8 HTTP.sys漏洞 深入分析
0.00雪花
void UlContentRangeHeaderHandler(REQUEST_INFO *request_info,
char *request_value,
int len)
{
Char *szBytes = “bytes”;
Int begin64[2]; //低地址存放低32位,高地址存放高32位
Int length64[2]; //这两个参数用于保存UlpParseRange解析range域的值
If(len < sizeof(“bytes”))
{
Return;
}
For(int i = 0;i < sizeof(“bytes”);++i)
{
If(request_value[i] != szBytes[i])
{
Return;
}
}
//调用UlpParseRange处理bytes后面的begin和end,也就是“0-18446744073709551615”
UlpParseRange(request_value, len, &begin64, &length64);
//将begin和length保存到HTTP Request对象的range属性,2个64位数,共16字节
Memcpy(request_info->range, &begin, 0x10);
}
int UlpParseRange(char *request_value,
int request_len,
int *begin64,
int *length64)
{
//UlpParseRangeNumber函数作用是将字符串解析为64位整数,就不贴代码了
//解析符号“-”前的begin,将结果保存到begin64
UlpParseRangeNumber(request_value, &request_len, &request_value, begin64);
...
...
//request_value修正,request_len修正操作
...
...
//解析符号”-”后面的end,将结果保存到
UlpParseRangeNumber(request_value, &request_len, &request_value, length64);
//下面开始进行合法性检查
If((begin64低32位) & (begin64高32位) == 0xFFFFFFFF)
{
Return error;
}
If(begin64高32位 >= length64高32位)
{
If(begin64高32位 > length64高32位)
{
Return error;
}
Else
{
If(begin64低32位 > length64低32位)
{
Return error;
}
}
mov eax, leng64低32位 //0xFFFFFFFF
mov edi, begin64低32位 //0x0
mov ecx, length64高32位 //0xFFFFFFFF
mov edx, begin64高32位 //0x0
sbb eax, edi //补丁修复前
sbb ecx, edx
add eax, 1 //eax = 0x0,保存请求长度的低32位
adc ecx, 0 //ecx = 0x0,保存请求长度的高32位
*length_64 = eax; //length64是一个int [2]数组,高地址保存高32位
*(length_64 + 4) = ecx;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课