最近的 WannaCry 勒索软件攻击利用了旧 Windows SMB 代码中的漏洞。被引用为易受攻击的1的大概逆向工程函数如下:
unsigned int __fastcall SrvOs2FeaToNt(int a1, int a2)
# {
# int v4; // edi@1
# _BYTE *v5; // edi@1
# unsigned int result; // eax@1
#
# v4 = a1 + 8;
# *(_BYTE *)(a1 + 4) = *(_BYTE *)a2;
# *(_BYTE *)(a1 + 5) = *(_BYTE *)(a2 + 1);
# *(_WORD *)(a1 + 6) = *(_WORD *)(a2 + 2);
# _memmove((void *)(a1 + 8), (const void *)(a2 + 4), *(_BYTE *)(a2 + 1));
# v5 = (_BYTE *)(*(_BYTE *)(a1 + 5) + v4);
# *v5++ = 0;
# _memmove(v5, (const void *)(a2 + 5 + *(_BYTE *)(a1 + 5)), *(_WORD*)(a1 + 6));
# result = (unsigned int)&v5[*(_WORD *)(a1 + 6) + 3] & 0xFFFFFFFC;
# *(_DWORD *)a1 = result - a1;
# return result;
# }
虽然看起来这个函数将数据从一个地方复制到另一个地方,但我们被告知应用程序未能对用户提供的输入执行足够的边界检查,有人可以详细解释这个函数应该逐行做什么以及它在哪里有缺陷吗?