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

打印 上一主题 下一主题

主题 967|帖子 967|积分 2901

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

这里我们主要以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

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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表