【HUST】网络攻防实践|5_二进制文件补丁技术|实验一 overflow
安装KeyPatch插件
参考:IDAPro V7.0中keypatch插件不显示解决办法_yirj的博客-CSDN博客_keypatch。
首先pip install keystone
安装。
然后将安装的keystone
文件夹移动到IDAPro V7.0/python
的目录下,再从keypatch/keypatch.py at master · keystone-engine/keypatch (github.com)目录下复制keypatch.py
文件到IDAPro V7.0/plugins
下。
实验要求
- 修补逻辑漏洞修补:令程序仅打印与自己性别相对应的话;
- 修补栈溢出漏洞修补:无论输入多长的字符串均不会导致程序崩溃。
实验过程
观察程序,逻辑漏洞来自于直接输出两行,栈溢出漏洞来自于gets
函数。
1. 逻辑漏洞
右键输出boy
的call _puts
,改成nop
即可。
2. 栈溢出漏洞
要修改某个函数的漏洞,一般是先在.eh_frame
中随意选择一段用来插入补丁代码,将call 函数
改成jmp 选择的.eh_frame的起始位置
。补丁代码最后包含语句call 函数
和jmp 函数调用的下一条指令的地址
,这样就能保证跳进再跳回。
在这里,gets
函数的地址是0x05A0
,调用gets
函数的下一条指令的地址是0x0701
。我选择插入补丁的位置的起始地址是0x08C2
。
修改gets
函数的漏洞,我并不清楚应该用什么方法,所以我搜索了一下修补的方案,在这篇知乎文章上找到了说法ctf中关于syscall系统调用的简单分析——常用的修补方法是改用系统调用 read()
函数来替代gets()
函数的功能,因此在补丁代码的最末并不需要调用原函数。
文章中说了read()
系统调用在64位系统中是0号,在32位系统中是3号,我的测试环境是64位Linux,因此需要先将eax
赋值为0号,再执行syscall
。
如下图所示,在调用补丁代码之前,恰好eax
被赋值为0。
因此系统调用号已经是0,不用再做修改。补丁代码如下:
mov edx, 0Ah ;设置长度为10,
lea rsi, [rbp-0Bh] ;将字符串地址赋值给rsi
mov rdi, 0
syscall ;系统调用
jmp 0x0701 ;跳回执行流程
右键0x08C2
的位置-KeyPatch,由于输入长度限制,先输入mov edx, 0Ah; lea rsi, [rbp-0Bh]; mov rdi, 0; syscall
,再单独改jmp 0x0701
。
修改完之后,按’C
’即可将数据段改成代码段显示出来。
可见补丁代码的部分是0x08C2~0x08D4
。
修改完成后Edit-Patch program-Apply patches to input file…
,点击确定。
然后再运行一下,可以看到两个漏洞的修补要求都满足了。
(由于隐私原因,我抹除了所有个人信息)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix