在逆向__alloca_probe函数时,发现有这么几条带bnd前缀的指令:
.text:00413270 __alloca_probe proc near ; CODE XREF: sub_40C590+8↑p
.text:00413270 ; sub_40EF60+8↑p
.text:00413270 51 push ecx
.text:00413271 8D 4C 24 04 lea ecx, [esp+4]
.text:00413275 2B C8 sub ecx, eax
.text:00413277 1B C0 sbb eax, eax
.text:00413279 F7 D0 not eax
.text:0041327B 23 C8 and ecx, eax
.text:0041327D 8B C4 mov eax, esp
.text:0041327F 25 00 F0 FF FF and eax, 0FFFFF000h
.text:00413284
.text:00413284 unknown_libname_3: ; CODE XREF: __alloca_probe+2B↓j
.text:00413284 3B C8 cmp ecx, eax ; Microsoft VisualC 14/net runtime
.text:00413286 F2 72 0B bnd jb short unknown_libname_4 ; Microsoft VisualC 14/net runtime
.text:00413289 8B C1 mov eax, ecx
.text:0041328B 59 pop ecx
.text:0041328C 94 xchg eax, esp
.text:0041328D 8B 00 mov eax, [eax]
.text:0041328F 89 04 24 mov [esp+0], eax
百度了一下,发现bnd指令的如下解释:
bnd是Intel MPX( Memory Protection Extensions,内存保护扩展)的一部分。
BND 表示返回目标(或通常是分支目标,因为 BND 可应用于任何控制流指令)
应根据 BND0 到 BND3 寄存器中指定的边界进行检查,
否则将产生异常——表明潜在的堆栈溢出、编程错误或恶意代码攻击。
在不支持 Intel MPX 的处理器上,或者当 MPX 被禁用时,
BND 前缀表现为无操作。注意 BND 前缀的编码和 REPNE 前缀的编码是一样的(都是 F2),
所以不知道 MPX 的老反汇编器可能会将此指令序列显示为 REPNE RET(或 REPNE JMP, REPNE CALL 等)。
bnd0-bnd3寄存器的存取使用如下指令:BNDMOV或BNDSTX
关于这几个寄存器和bnd指令的关系,参考如下链接:
https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol1/o_7281d5ea06a5b67a-398.html
关于mpx的参考链接:
https://intel-mpx.github.io/design/
关于bnd的论文:
https://security.csl.toronto.edu/papers/whuang_lmp_acsac2016.pdf