【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下。

实验要求

  1. 修补逻辑漏洞修补:令程序仅打印与自己性别相对应的话;
  2. 修补栈溢出漏洞修补:无论输入多长的字符串均不会导致程序崩溃。

实验过程

观察程序,逻辑漏洞来自于直接输出两行,栈溢出漏洞来自于gets函数。

1. 逻辑漏洞

右键输出boycall _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…,点击确定。

然后再运行一下,可以看到两个漏洞的修补要求都满足了。

(由于隐私原因,我抹除了所有个人信息)

在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shandianchengzi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值