f9373b24 83e103 and ecx,3 f9373b27 f3a4 rep movs byte ptr es:[edi],byte ptr [esi] ;复制宽 字符不含 00 到errorLogEntry的 String处 f9373b29 8d0c00 lea ecx,[eax+eax] f9373b2c 014d14 add dword ptr [ebp+14h],ecx ;将指针指向下一 处字符串 f9373b2f 8b4d14 mov ecx,dword ptr [ebp+14h] f9373b32 66832100 and word ptr [ecx],0 ;增加"\x00\x00"结尾 存储错误宽字符串的空间大小只有70h,除去一个字符串的大小后,后面会加上”0x00 0x00”补充,如果说第一个字符串的大小小于70h则会复制第二个字符串(大小会减去之前 复制的),否则就不会复制。但是错误代码在于,假设说我们首先构造一个“正常的”数据 包,大小为 54个字节(54 个’A’),其复制在宽字符串中为54(字符串个数)*2(宽字符的 大小)+2(两个空格)=110(6Eh),如果执行代码段: f9373b11 d1e8 shr eax,1 f9373b13 48 dec eax f9373b14 85c0 test eax,eax f9373b16 7639 jbe mrxsmb!BowserWriteErrorLogEntry+0x1a5 (f9373b51) 所以说,70h(112)-6Eh(110)=2,在右移一位(相当于除以2)正好为1,减去 1 就是0, 此后判读条件通过就跳出复制的循环。 但是,如果我们是构造的55 个字符串呢?就会出现112-(55*2+2)=0,这个时候再除以 2 减去 1就会出现-1 的情况,这时jbe是判断其不跳转,等同于任由错误的代码继续,再接 下来的汇编代码中,就会发生复制错误,蓝屏就是发生在执行复制数据的代码中:
f9373b18 8d0c00 lea ecx,[eax+eax]
这么看来,要修补该漏洞的最简单办法有两个,其中之一就是将jbe 逻辑判断改为jl, |