任何人都可以详细解释使用此策略的实际含义。
感谢
#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_2
或cmd.type
以外的任何值,则shell_cmd
不会被初始化,并且未知值将传递给利润丰厚的system
调用。能够设置
cmd->shell_cmd
设置为有效(和恶意)shell命令的特定值可能会导致我们在目标上执行代码。简而言之,堆喷涂是通过我们要执行的特定shell命令来填充大量堆内存空间的行为。堆整形
现在这是一个相对琐碎的情况,并且经常使用堆喷射/整形来利用内存破坏错误,但这是无关紧要的。通常,您将解决更多的限制以成功利用内存损坏,而“用数据填充堆”根本是不够的。
双重释放和释放后使用的错误将要求将特定的对象/结构分配到先前不同对象所在的相同空间。然后,您需要以某种方式确保堆具有特定的形状,以便一个不同的对象将“适合”到合并的堆(或高碎片堆,而不是低碎片堆)中。您可能需要确保通过原语控制的特定实例分配在正确的位置。以特定的方式使堆成为所谓的“堆整形”