利用这种类型混淆的方法实际上是将其转换为释放后使用的情况。这是借助系统调用实现的namedobj_delete :
类型混淆允许我们将一个namedobj_usr_t对象强制转换为 namedobj_dbg_t1,然后更新所有namedobj_dbg_t字段。这不仅允许我们写入实际namedobj_usr_t 对象的末尾,还允许我们写入namedobj_usr_t.name 指针的低 32 位以及所有其他namedobj_usr_t字段。事实上,我们只能更新namedobj_usr_t.name指针的低 32 位,这反而是一件好事(尽管对本文而言影响不大)。
因此,我们拥有的释放后使用原语允许我们释放free()任何与目标地址共享最高 32 位的内核地址no->name。这意味着我们可以选择释放任何通过 malloc 分配的指针——我们只需要找到这样的指针即可 :) 显然,在释放指针并重新分配底层内存之后,应该能够以良好的方式使用它。
咨询:
@feijinhsa