[pwnable.kr]Dragon
0x00: dragon 是一个UAF漏洞的利用。
- UseAfterFree 是堆的漏洞利用的一种 简单介绍 https://www.owasp.org/index.php/Using_freed_memory
- 简单的来说就是 再次使用了 free 掉的内存
0x01:简单看一下
运行起来看一下
是一个RPG游戏,有两种角色,每个角色的技能不一样(战士法师之类的吧...)
在进IDA分析的时候,发现龙是分两种的 baby_dragon 和 mommy_dragon,两种的血量和攻击力也各不相同。
而且龙的结构体是通过动态分配,填充数据,在龙死亡之后这部分内存free掉,再次游戏就会再分配内存...如此循环
此外,发现一个神秘关卡
看着很美好,但是没什么x用,读取字符串限定长度,所以从这里拿不到shell的~
0x02:分析
还是要从内存分配上下手,只有先打赢dragon才可以free内存,再次分配,才会有机会玩。
会去看看龙的结构体
在dragon结构体中,表示血量的数据存储在 eax+8 的地方,还是 1 byte 的大小,范围应该是 0~127
龙种类有两种,我们需要出现mama dragon(血多,打的少)
龙的血量在小于零的时候就会死亡!这点很关键。
RPG游戏的角色有两个,knight和priest。每个角色技能不一样。
priest 的 3 可以 使用mp 使得 dragon攻击无效,这时候dragon血量会恢复。那就可以使用priest,耗到dragon血量 溢出,一旦小于零(溢出),那么dragon就死了,也就是让它加血加到溢出。
0x03:控制流程
IDA里查看流程,在胜利之后,free() 之后又重新malloc分配了龙的结构体,这时候 在输入名字的时候,我们可以控制4字节。(call eax)
也就是:先死亡一次,再利用priest角色的技能使龙加血加到溢出 死亡后有控制4字节的机会,把那4字节填充成system("/bin/sh")的地址,就可以拿到shell了。
0x04:怎么操作
大概流程:
- 故意死亡一次
- 选择priest角色 332 的操作3轮
- 最后程序会有输入,这时候写入4字节到eax,之后程序会call eax
验证漏洞
写出exp打远程服务器
打一发之后
哈哈哈 搞定了
结束语: UAF 挺有意思~ 顺便把pwnable.kr的UAF那个关卡也给秒了~挺简单的 就不写了
Show Me The #.