最近的 RDP漏洞和漏洞利用提到了堆整形技术的使用。任何人都可以详细解释使用这种策略的实际情况。
谢谢
最近的 RDP漏洞和漏洞利用提到了堆整形技术的使用。任何人都可以详细解释使用这种策略的实际情况。
谢谢
堆整形(也称为堆整理,用于更被动的方法)是开发漏洞利用时堆喷射的更智能的兄弟。因此,要正确解释堆整形,首先必须熟悉堆喷射。
堆喷射是使用外部攻击原语故意用重复/顺序数据填充(喷射)目标进程的堆空间的行为。
例如,您发现了一个未初始化变量的错误,其中一个变量在它应该初始化的时候没有初始化,然后以一种可能危险的方式使用,这取决于它的实际值。
一个例子可能会更清楚:
typedef struct __struct_cmd {
int type;
char shell_cmd[1024];
} struct_cmd;
void safe_cmd(struct_cmd* cmd)
{
switch (cmd->type)
{
case CMD_1:
strcpy(cmd->shell_cmd, SAFE_CMD1);
break;
case CMD_2:
strcpy(cmd->shell_cmd, SAFE_CMD2);
break;
}
system(cmd->shell_cmd);
}
在上面的示例中,很容易注意到,如果用户提供除CMD_1或CMD_2for之外的任何值cmd.type,shell_cmd都不会未初始化,并且未知值将传递给利润丰厚的system调用。
能够设置cmd->shell_cmd为有效(和恶意)shell 命令的特定值可能会让我们在目标上执行代码。简单地说,堆喷射是用我们想要执行的特定 shell 命令填充大量堆内存空间的行为。
现在这是一个相对微不足道的案例,并且经常使用堆喷射/整形来利用内存损坏错误,但这无关紧要。通常,您需要解决更多限制以成功利用内存损坏,而“用数据填充堆”是不够的。
Double-free 和 use-after-free 错误将需要将特定对象/结构分配在不同对象先前所在的同一空间中。然后您需要确保堆具有特定形状,以某种方式,以便不同的对象将“适合”合并堆(或高碎片堆,而不是低碎片堆)。您可能需要确保您通过原语控制的特定实例分配在正确的位置。以这种特定方式获得堆就是所谓的“堆整形”