dragon

0x00:dragon 是一个UAF漏洞的利用。

  • UseAfterFree 是堆的漏洞利用的一种简单介绍
  • 简单的来说就是 再次使用了 free 掉的内存

    0x01:简单的看一下

    运行起来看一下
    info

是一个RPG游戏,有两种角色,每个角色的技能不一样(战士法师之类的吧…)
在进IDA分析的时候,发现龙是分两种的 baby_dragon 和 mommy_dragon,两种的血量和攻击力也各不相同。

而且龙的结构体是通过动态分配,填充数据,在龙死亡之后这部分内存free掉,再次游戏就会再分配内存…如此循环
此外,发现一个神秘关卡:
sl
看着很美好,但是没什么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)

0x04:怎么操作

大概流程如下:

  1. 故意死亡一次

  2. 选择priest角色 332 的操作3轮

  3. 最后程序会有输入,这时候写入4字节到eax,之后程序会call eax

    验证漏洞

    写出exp打远程服务器

    打一发之后

    搞定~~

    0x05:结束语

    UAF 挺有意思~ 顺便把pwnable.kr的UAF那个关卡也给秒了~挺简单的 就不写了。