堆整形技术的解释以及它与堆喷射的区别

逆向工程 开发
2021-07-04 23:33:26

最近的 RDP漏洞和漏洞利用提到了堆整形技术的使用。任何人都可以详细解释使用这种策略的实际情况。

谢谢

1个回答

堆整形(也称为堆整理,用于更被动的方法)是开发漏洞利用时堆喷射的更智能的兄弟。因此,要正确解释堆整形,首先必须熟悉堆喷射

堆喷

堆喷射是使用外部攻击原语故意用重复/顺序数据填充(喷射)目标进程的堆空间的行为。

例如,您发现了一个未初始化变量的错误,其中一个变量在它应该初始化的时候没有初始化,然后以一种可能危险的方式使用,这取决于它的实际值。

一个例子可能会更清楚:

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_1CMD_2for之外的任何值cmd.typeshell_cmd都不会未初始化,并且未知值将传递给利润丰厚的system调用。

能够设置cmd->shell_cmd为有效(和恶意)shell 命令的特定值可能会让我们在目标上执行代码。简单地说,堆喷射是用我们想要执行的特定 shell 命令填充大量堆内存空间的行为。

堆整形

现在这是一个相对微不足道的案例,并且经常使用堆喷射/整形来利用内存损坏错误,但这无关紧要。通常,您需要解决更多限制以成功利用内存损坏,而“用数据填充堆”是不够的。

Double-free 和 use-after-free 错误将需要将特定对象/结构分配在不同对象先前所在的同一空间中。然后您需要确保堆具有特定形状,以某种方式,以便不同的对象将“适合”合并堆(或高碎片堆,而不是低碎片堆)。您可能需要确保您通过原语控制的特定实例分配在正确的位置。以这种特定方式获得堆就是所谓的“堆整形”