超过十万个Zyxel设备被曝存在后门
决定最终的漏洞利用策略 为了弄清楚如何在触发我们的堆内存覆盖之前对data_数组进行最佳定位,我们需要检查一下堆的状态。到目前为止,我们有两个感兴趣的目标:png_ptr结构体和运行时解析器正在使用的动态链接器数据。
如果我们检查png_ptr结构体数据所在的堆分块,我们就会发现,它是一个大小为0x530的main arena分块。 通过Root Page No 4计算出Root Page的物理地址。根据Root Page中指定的段信息,向Root Page中插入索引数据,向数据段对应的页中插入数据行,并关联两种类型的页。 如果一页空间不足,会计算出当前页所在的区/簇并向其申请空间,区/簇则会根据 XDES Entry中的bitmap查询空闲的页并进行分配。如果区/簇也没有空闲空间,则会一级一级向上面的段、表空间、操作系统申请所需空间。 申请到的表空间会存储在各自对应的链表中(如:表空间申请到的空间会存储在对应的FSP_FREE链表中)。 在页分配或扩展时,为了保证通过innodb_indexes中的Root Page No能找到它,Root Page物理空间与B+树对应的Root 节点保持不变,即页号不变,永远是页号为4的那块空间。 当B+对应的物理页不断变化时,为了保证树的平衡,会产生新的Root节点,为了保持Root页不变,innodb是通过交换的方式,把新的Root节点数据复制交换到原来的Root Page页,这样就可以保证Root Page永远不变,即保证表与物理空间的关联永远不会断开。 总结
段、区都是为了管理空间的存储状态,为页分配空间服务,真正的查询只需要通过Page No和B+树中各级节点的关联关系就可以操作整个表物理空间上的数据。 行是最终存储业务数据的物理单元。默认一页16K,可以存储大概1000多行索引数据(非叶子节点),或者20行甚至更多的业务数据(叶子节点)。页之间通过B+树的“二分找查(假设为多分)”算法快速定位数据,页内则通过 Page Directory,把多行分一组,一组对应Page Directory有序数组中的一个slot,这样可以在页内进行一次“二分查找”优化。
为了记录行本身的状态,一条记录innodb会增加额外的记录头信息。如果是叶子节点,还会增加:row_id(隐藏的主键)、trx_id(事务id)、回滚指针等附加字段。 (编辑:常州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |