-
-
[原创]2025 KCTF Magic_VM 第八题 暗云涌动设计思路
-
发表于: 2025-7-29 22:32 2525
-
题目整体框架是一个vm虚拟机,包含栈相关、alu相关、以及内存操作相关的指令。

题目引入自由度较高的用户可控指针,寄存器的最高位即第63位作为标志位,当最高位为1时将寄存器的值作为一个指针地址,可以对其进行store写入以及load载出的操作。

正常情况下alu操作会对寄存器最高位进行校验,如果是两寄存器都是指针的alu操作则会将其最高位清空变为非指针值,而其中一个为指针时,会调用函数adjust_pointer进行校验会调整。

可以看到adjust_pointer函数只允许data、stack两种指针,其他非法指针会将其调整为data指针。

这里看似很安全,但实际未对两者都不是指针的情况进行校验,当两寄存器都不是指针,但是计算的结果能够将高位变成1时,就会使得构造出一个非法指针同时绕过检查。例如:
但是由于程序开启了pie保护,所以还需要泄露地址信息。
在先前的adjust_pointer函数分析时,有提到如果不是data段或者stack段就会返回默认的data段指针。

而其中data段是一个固定的0x200000地址,stack段则是malloc申请的堆地址。

由此,当我们调用adjust_pointer函数校验并调整指针时,如果指针不符合两个区间就会指向data段,因此我们可以通过该函数判断指针是否指向stack段。
题目有给到jump函数,因此我们可以通过只使用vmcode来遍历整个堆的可能地址空间,并找到合法的stack指针,从而得到堆地址。
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
最后于 2025-8-31 12:17
被kanxue编辑
,原因:
赞赏
赞赏
雪币:
留言: