题目来源:
https://github.com/xerof4ks/heapwn/tree/master/rhme3
堆的题目基本都是选择菜单,这里可以添加,删除,选择,编辑,展示球员,还可以显示队伍,功能看着很多啊
首先玩玩一下这个游戏,便于后期逆向一些数据结构
上面就是球员这个结构有什么信息,第一个 free slot 就相当于球员的 id,这个不用我们输入
remove 就删除咯
select 会输出球员的信息
edit 当前的 palyer,基于上面的 select
show palyer,这个显示的是 select 的 player
show team 会将所有球员信息打印出来
经过对 add_player 的逆向,可以推出 palyer 的结构
编写 add_palyer 查看内存结构
查看内存如下,大小为 0x20,
添加两个球员
了解得差不多了,开始吧
看下 delete,判断 index 不能大于 10,且全局 players 数组不为 0,而且 delete 后将相应的 players 索引置 0,所以不存在 double free,free 的时候首先将 name 释放,再释放整个 palyer
那看看释放后能否重用,看看 show palyer,因为 delete 没将 selected 置 0,导致可以重用,这可以导致信息泄露
再有 edit 可以导致任意地址写漏洞
那怎么占位呢(下面图说的 0x17 不一定,我们 0x16,0x15 等也能占位,差不多大小就行)
就是创建两个 palyer,都 free 掉,再创建一个 palyer 即可占位,用 name 占第二个 palyer 的结构
还有我们下面写 got 的话有两个目标,一个 atoi,一个 strlen,不过 atoi 的话传入的参数只有四字节,只能传个 sh 过去了,strlen 也是可以的,留给大家尝试,就不贴出来了