[Pwnable.kr] dragon

04. 3 月 2016 pwnable writeup 0

略需要逆向的一道题,是一个打怪兽的小游戏。首先F5看一下代码(只贴关键部分)

大概意思说是一个勇士战恶龙的游戏,有两种角色可以选,角色有三个技能,分别可以heal/damage巨龙和自己。一般pwn的东西都要有溢出,或者uaf或者2free这样的,输入点基本只有数字,没有什么可以溢出的,最后的胜利之后输入名字也没办法溢出。那么看看后两个。

FightDragon的开始在堆上分配了两个结构体ptr和v5,其中v5代表dragon的struct,这块内存释放点有两个,一个是在战胜巨龙之后(xxxxAttack),另一个是在FightDragon结束时。如果游戏胜利战胜了巨龙,那么v5就会被free掉,此时v5处于dangling状态,然而在xxxxAttach结束之后,在输入姓名的代码块中执行了 ((void (__cdecl *)(_DWORD *))*v5)(v5); ,关键就看我们能不能控制v5的内存块。

在执行v5之前,我们会malloc一块内存来存姓名,这个大小恰好与v5的大小相同,而名字是用户输入的,所以这块内存时可以由我们控制的,所以这里有UAF。

我们用gdb看一下dragon文件,发现aslr是off状态,这样就很简单了,只要把call system的地址填到v5的位置就可以了。

 

剩下就还剩一个问题了,如何获得胜利。恶龙有两种,一种是Mama一种是Baby,v5[8]代表血量,x5[9]代表回血速度,v5[3]代表攻击力,Baby的血量少一些,但是每次比Mama多回一格血,攻击力也更高。Priest角色有三个技能:1. HolyBolt,花费10点魔法打龙20点伤害;2. Clarity,刷新mana(魔法?);3. HolyShield,费25点魔法闪避一次攻击……Knight的属性就不详细说了,造成伤害高一点,但是自己也要费很多魔法,所以最后打下来肯定是打不过的。MP(Q@%FG~X%LEM$Z[Y_URZM

判断龙是不是死了就是上面这个代码,我们发现血量居然是个byte值(-128~+127),如果正面刚不过,能不能让龙的血量溢出呢?只要我们能活到那个时候就可以。如果碰上Baby应该活不过两回合,如果是Mama,只需要三个回合就能让龙血量溢出,所以我们只需要使用HollySheid一直当透明,最后被龙打一下也不会死(别攻击龙……),然后他就溢出了……

 


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.