探索堆题的起点——修改结构体
探索堆的起点——修改结构体
这里我们主要以CTF wiki 上UAF的例题hacknote为例 去创建一个结构体 探索堆题代码结构的真相 让pwn师傅少点逆向的痛
1.分析程序
分析程序 我们发现 主要有这几个需要添加结构体来便于我们分析 首先我们要知道的是
**(¬elist + i) 存的其实是print_note_content这个函数的指针
*(v0 + 4) 存的其实是content_chunk的指针值
((¬elist + i) + 1) 这个位置 存储的其实是content的内容
下面我们来讨论一个问题:
我们要区分 *(v0 + 4) 和 ((¬elist + i) + 1) 里的4 1分别是什么型?
根据指针的运算 我们知道
其实这里的4 是四个字节 而这里的1 是加了一个整数类型
2.创造结构体
根据分析内容 我们开始尝试去创建结构体
我们可以直接使用shift+F1 来进入struct的页面 ida里允许我们直接去写一段c代码的struct来插入(我们只需要在struct界面敲insert键)
我们去拟定我们的代码
# 我们创建一个名叫hacknote的结构体 并且起了一个简写名称叫note
typedef struct note{
char * print_ptr;
char * content;
}hacknote;
如下图所示:
我们成功的添加进入了 两个结构体
3.修改数据类型
我们先修改第一块内容的¬elist+i的内容 按“Y”键查看 ida本来给他识别的数据类型
按照循环我们知道 应该是会创建5个notelist数组 这里我们能直接修改数组内容
修改数组内容如下:
我们可以看到 notelist数组已经被修的十分完美了
接下来我们来使用我们的结构体
同样的 我们选中notelist数组 修改类型
这里我们看到这个类型为void型 我们可以改成我们的结构类型note
修完后 我们就可以很清楚的发现我们的代码更清晰了
到此,你就已经完成了一次结构体的创建与修复。