探索堆题的起点——修改结构体

[复制链接]
发表于 2023-10-5 12:32:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
探索堆的起点——修改结构体

这里我们主要以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 是加了一个整数类型

2.创造结构体

根据分析内容 我们开始尝试去创建结构体
我们可以直接使用shift+F1 来进入struct的页面 ida里允许我们直接去写一段c代码的struct来插入(我们只需要在struct界面敲insert键)

我们去拟定我们的代码
  1. # 我们创建一个名叫hacknote的结构体 并且起了一个简写名称叫note
  2. typedef struct note{
  3.         char * print_ptr;
  4.         char * content;
  5. }hacknote;
复制代码
如下图所示:

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

3.修改数据类型

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

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

修改数组内容如下:

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

接下来我们来使用我们的结构体
同样的 我们选中notelist数组 修改类型

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

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

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

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表