解释永恒之蓝 SMB 攻击使用的易受攻击的代码

逆向工程 视窗 开发
2021-06-19 13:38:59

最近的 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;
# }

虽然看起来这个函数将数据从一个地方复制到另一个地方,但我们被告知应用程序未能对用户提供的输入执行足够的边界检查,有人可以详细解释这个函数应该逐行做什么以及它在哪里有缺陷吗?