探索堆题的起点——修改结构体
探索堆的起点——修改结构体这里我们主要以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.分析程序
分析程序 我们发现 主要有这几个需要添加结构体来便于我们分析 首先我们要知道的是
**(¬elist + i)存的其实是print_note_content这个函数的指针
*(v0 + 4) 存的其实是content_chunk的指针值
((¬elist + i) + 1) 这个位置 存储的其实是content的内容
下面我们来讨论一个问题:
我们要区分 *(v0 + 4) 和 ((¬elist + i) + 1) 里的4 1分别是什么型?
根据指针的运算 我们知道
其实这里的4 是四个字节 而这里的1 是加了一个整数类型
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150909335-2048571654.png
2.创造结构体
根据分析内容 我们开始尝试去创建结构体
我们可以直接使用shift+F1 来进入struct的页面 ida里允许我们直接去写一段c代码的struct来插入(我们只需要在struct界面敲insert键)
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150908340-573557300.png
我们去拟定我们的代码
# 我们创建一个名叫hacknote的结构体 并且起了一个简写名称叫note
typedef struct note{
char * print_ptr;
char * content;
}hacknote;如下图所示:
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150907387-1986635507.png
我们成功的添加进入了 两个结构体
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150906213-1991446080.png
3.修改数据类型
我们先修改第一块内容的¬elist+i的内容 按“Y”键查看 ida本来给他识别的数据类型
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150905253-43916865.png
按照循环我们知道 应该是会创建5个notelist数组 这里我们能直接修改数组内容
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150902117-1246185619.png
修改数组内容如下:
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150901713-610030533.png
我们可以看到 notelist数组已经被修的十分完美了
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150901317-852476003.png
接下来我们来使用我们的结构体
同样的 我们选中notelist数组 修改类型
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150900911-1130147028.png
这里我们看到这个类型为void型 我们可以改成我们的结构类型note
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150900447-316984068.png
修完后 我们就可以很清楚的发现我们的代码更清晰了
https://img2023.cnblogs.com/blog/3165230/202309/3165230-20230926150859943-1552599645.png
到此,你就已经完成了一次结构体的创建与修复。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]