打堆第一步,先”斩“结构体

这里我们主要以CTF wiki 上UAF的例题hacknote为例 去创建一个结构体 探索堆题代码结构的真相 让pwn师傅少点逆向的痛

题目:ctf-challenges/pwn/heap/use_after_free/hitcon-training-hacknote/hacknote at master · ctf-wiki/ctf-challenges (github.com)

引用:IDA 分析技巧记录 - F0und

1.分析程序

分析程序 我们发现 主要有这几个需要添加结构体来便于我们分析 首先我们要知道的是

**(&notelist + i) 存的其实是print_note_content这个函数的指针

*(v0 + 4) 存的其实是content_chunk的指针值

((&notelist + i) + 1) 这个位置 存储的其实是content的内容

下面我们来讨论一个问题:

我们要区分 *(v0 + 4) 和 ((&notelist + i) + 1) 里的4 1分别是什么型?

根据指针的运算 我们知道

其实这里的4 是四个字节 而这里的1 是加了一个整数类型

image-20230926112444800

2.创造结构体

根据分析内容 我们开始尝试去创建结构体

我们可以直接使用shift+F1 来进入struct的页面 ida里允许我们直接去写一段c代码的struct来插入(我们只需要在struct界面敲insert键)

image-20230926113317228

我们去拟定我们的代码

1
2
3
4
5
# 我们创建一个名叫hacknote的结构体 并且起了一个简写名称叫note
typedef struct note{
char * print_ptr;
char * content;
}hacknote;

如下图所示:

image-20230926113708054

我们成功的添加进入了 两个结构体

image-20230926113745669

3.修改数据类型

我们先修改第一块内容的&notelist+i的内容 按“Y”键查看 ida本来给他识别的数据类型

image-20230926145358287

按照循环我们知道 应该是会创建5个notelist数组 这里我们能直接修改数组内容

image-20230926145638994

修改数组内容如下:

image-20230926145754188

我们可以看到 notelist数组已经被修的十分完美了

image-20230926145850975

接下来我们来使用我们的结构体

同样的 我们选中notelist数组 修改类型

image-20230926150042763

这里我们看到这个类型为void型 我们可以改成我们的结构类型note

image-20230926150206058

修完后 我们就可以很清楚的发现我们的代码更清晰了

image-20230926150308428

到此,你就已经完成了一次结构体的创建与修复。


打堆第一步,先”斩“结构体
https://kee02p.github.io/2023/09/26/先”斩“结构体/
作者
Kee02p
发布于
2023年9月26日
许可协议