-
-
[原创] dragon pwnable.kr writeup
-
-
[原创] dragon pwnable.kr writeup
980K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4m8%4L8X3q4T1L8r3g2Q4x3X3g2C8M7W2)9J5c8Y4m8D9j5i4W2Q4x3X3g2H3K9s2l9`. 中的 dragon
main() -> playgame():选择人物角色 -> fightdragon():与生成的龙角色进行回合制战斗
好,进入游戏。。。。
10分钟过去了。。。。
当我们分析正常逻辑,在游戏中人类永远无法赢得过龙。
但是看到在FightDragon函数中,对mama dragon初始化代码。

mama dragon 的血量表示只占一个字节。
一个字节能表示的最大血量是 127。
代码逻辑中当血量小于0时,判定我们胜利。
并且 free(dragon)。
所以我们可以选择角色 Priest 与 MamaDragon 进行战斗,防守(选项3)两次,然后(选项2)进行回复体力。
这样 3 4 个回合之后,每3个回合,mamaDragon血量增加12,初始是80,3 4个回合之后 80+48 = 128 > 127。
所以 3 * 4 个回合之后,血量为负值。
赢了之后的代码,

因为赢了之后会 free(dragon)。 在这又分配dragon相同大小内存,然后标准输入填充内容, 调用dragon 的首4byte指向的函数。
因此,到这里会触发 use after free 漏洞,而我们只需要将前4个字节填写为其他指令地址,就可以进行控制流劫持。
经过查找,我们发现

该地址处调用了system("/bin/sh")。
好了,那我们将输入前4个字节填充成 0x80480BF
就可以获得shell 。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-8-7 23:05
被j3rry编辑
,原因: 上传图片