最近的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_1提供CMD_2cmd.type以外的任何值,则shell_cmd不会被初始化,并且未知值将传递给利润丰厚的system调用。

能够设置cmd->shell_cmd设置为有效(和恶意)shell命令的特定值可能会导致我们在目标上执行代码。简而言之,堆喷涂是通过我们要执行的特定shell命令来填充大量堆内存空间的行为。

堆整形

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

双重释放和释放后使用的错误将要求将特定的对象/结构分配到先前不同对象所在的相同空间。然后,您需要以某种方式确保堆具有特定的形状,以便一个不同的对象将“适合”到合并的堆(或高碎片堆,而不是低碎片堆)中。您可能需要确保通过原语控制的特定实例分配在正确的位置。以特定的方式使堆成为所谓的“堆整形”