[网安实践III] 实验5.补丁

[网安实践III] 实验5.补丁

冷补丁

该作业主要考察同学们对二进制文件补丁修补方法及栈溢出漏洞的理解与掌握. 所用的实验环境和工具为: 
ubuntu 18.04 LTS
gcc 7.5.0
IDA Pro 7.0
Keypatch v2.2
程序的功能是实现一个非常简单的用户交互: 要求同学们输入自己的学号, 若输入的学号为10个字符, 则在屏幕上打印一段感谢和表扬的话. 源代码中共设计了一个逻辑缺陷和一个栈溢出漏洞, 要求同学们在没有程序源代码的情况下对二进制文件进行修补. 
程序的逻辑缺陷是当输入的学号为10个字符时, 重复打印了对男孩和女孩进行感谢和表扬的话, 正常情况下只需打印其中一句即可. 修补的方法比较简单, 直接用IDA中的Keypatch插件将其中一条打印语句改为空指令即可. 

1 修改逻辑缺陷

程序的功能是实现一个非常简单的用户交互: 要求同学们输入自己的学号, 若输入的学号为 10 个字符, 则在屏幕上打印一段感谢和表扬的话. 源代码中共设计了一个逻辑缺陷和一个栈溢出漏洞, 要求同学们在没有程序源代码的情况下对二进制文件进行修补.
程序的逻辑缺陷是当输入的学号为10个字符时, 重复打印了对男孩和女孩进行感谢和表扬的话, 正常情况下只需打印其中一句即可. 修补的方法比较简单, 直接用 IDA 中的 Keypatch 插件将其中一条打印语句改为空指令即可.

  1. 修改前运行截图, 可以看到会同时输出两句话
    在这里插入图片描述
  2. 修改过程截图
    修改前程序汇编代码:
    在这里插入图片描述
  3. 将其中一个 call _puts 指令替换为空指令. 修改后程序汇编代码:
    在这里插入图片描述
  4. 最后使用 Edit->Patch program->Apply patches to input file… 将修改保存到原二进制文件中. 运行结果如图, 仅显示其中一条语句:
    在这里插入图片描述

2 修改栈溢出函数

gets() 函数是一个非常典型的栈溢出函数, 常用的修补方法是改用 read() 函数来实现 gets() 函数的功能. 由于原始的程序中没有调用 read() 函数, 因此只能利用 .eh_frame 段, 通过 3 号 syscall 调用 read() 函数来实现补丁修补.
注: .eh_frame 段是 gcc 生成的用于异常处理的代码, 它生成一个用于描述如何展开函数调用栈的表. (Ref: .eh_frame的一些资料 - CSDN)

  1. 修改前运行截图, 可以看到当输入字符超过 10 个时会使程序崩溃
    在这里插入图片描述
  2. 修改前程序汇编代码:
    在这里插入图片描述
  3. .eh_frame 段添加调用 read() 的代码. 使用 IDA Pro 通过 Edit->Patch Program->Change byte… 修改 .eh_frame 中的机器码, 机器码如下:
BA 0A 00 00 00 48 8D 75 F5 48 C7 C7 00 00 00 00 0F 05 E9 6A FE FF FF

修改后汇编代码如图:
在这里插入图片描述
注: 按 C 键可以进行数据段到代码段的表示形式的切换.
4. 在 main() 函数中将 gets() 函数替换为调用 read() 函数的代码. 方法与上述相同, 修改 main 中的 call _gets 指令为 jmp loc_880, 机器码如下:

E9 7F 01 00 00

修改后汇编代码如图:
在这里插入图片描述
5. 最后使用 Edit->Patch program->Apply patches to input file… 将修改保存到原二进制文件中. 最后运行程序, 如图, 同样输入超过 10 个字符, 但程序并不会崩溃, 不会引发栈溢出漏洞.
在这里插入图片描述

热补丁

  1. 原始程序的功能包括一个简单的用户交互: 要求同学们输入自己的学号用于进行一些运算, 运算完成之后, 程序sleep若干秒, 之后退出. 原始程序的执行效果如下图所示:
    在这里插入图片描述
  2. 查看程序的源代码, 如图. 由于使用了不安全的 gets() 函数处理输入数据, 且缓冲区大小仅 11 个字节, 因此存在栈溢出可能性. 需要进行修补.
  3. 为修补 gets() 函数栈溢出漏洞, 可以使用安全的 fgets() 函数替换 gets() 函数, 编写的补丁代码如下(假设学号为 10 位, 另含一个结束符 \0)
    在这里插入图片描述
  4. 为了修改程序的功能, 定义了新的 sleep() 函数, 代码如下:
    在这里插入图片描述
  5. 对修改后的代码进行编译, 生成 .so 链接库文件. 代码如下:
$ gcc -fPIC --shared patch.c -o patch.so
  1. 利用 PRELOAD HOOK 进行补丁修补, 使用命令:
$ LD_PRELOAD=./patch.so ./original

新的程序执行效果如图:
在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ucos-iii-tcpip.a是一个软件库,用于嵌入式系统中使用μC/OS-III操作系统和TCP/IP协议栈进行网络通信的开发。 ucos-iii-tcpip.a提供了一系列的接口和函数,帮助开发人员在嵌入式系统中实现TCP/IP网络通信功能。它包含了TCP/IP协议栈的实现以及与μC/OS-III操作系统的接口,使得开发人员可以简单地在嵌入式系统中实现TCP/IP网络通信功能。 使用ucos-iii-tcpip.a可以方便地创建网络任务,并通过接口函数来管理和控制网络通信。它提供了一些常用的网络协议,如TCP、UDP、IP等,并且支持网络连接、数据传输等基本的网络操作。此外,ucos-iii-tcpip.a还提供了一些高级功能,如网络管理、安全性、QoS等,以满足不同应用场景的需求。 通过使用ucos-iii-tcpip.a,嵌入式系统开发人员可以快速、简便地添加网络通信功能,提高系统的灵活性和可扩展性。它提供了一种可靠、高效的方式来实现嵌入式系统与外部设备之间的数据交换,使得嵌入式系统能够连接到互联网,实现远程控制、数据传输等功能。 总之,ucos-iii-tcpip.a是一款强大的软件库,它结合了μC/OS-III操作系统和TCP/IP协议栈,为嵌入式系统提供了完善的网络通信功能,帮助开发人员快速构建并实现网络连接和数据传输等功能,使得嵌入式系统能够更好地适应各种应用场景的需求。 ### 回答2: ucos-iii-tcpip.a是一个TCP/IP协议栈的静态库文件。uCos-III是一个开发嵌入式实时操作系统的工具。它提供了一种可靠的方法来构建实时系统,并可以方便地适应不同的硬件和应用需求。 ucos-iii-tcpip.a库是基于uCos-III实时操作系统的一个扩展库,用于支持TCP/IP协议栈的功能。TCP/IP协议栈是计算机网络通信的基础,它包括传输控制协议(TCP)和互联网协议(IP)。通过使用这个库,开发者可以轻松地在嵌入式系统中实现TCP/IP网络通信功能。 ucos-iii-tcpip.a库提供了一系列接口和函数,用于处理与TCP/IP协议相关的任务,如网络连接的建立和断开、数据传输的处理等。它还包含了各种网络协议的实现,如IP、TCP、UDP等,以及网络应用层协议的支持,如HTTP、FTP等。开发者可以通过调用这些函数和接口来完成各种网络通信任务。 使用ucos-iii-tcpip.a库可以极大地简化开发者在嵌入式系统中实现TCP/IP通信的工作量。它提供了一个高效可靠的通信框架,可以帮助开发者快速构建自己的网络应用。一旦完成了TCP/IP通信的底层实现,开发者可以更加专注于应用层的业务逻辑开发,而不需要过多关注网络通信的细节。 总结来说,ucos-iii-tcpip.a是一个用于嵌入式系统中支持TCP/IP协议栈的静态库文件,它提供了一系列接口和函数,帮助开发者实现TCP/IP网络通信功能。使用这个库可以简化开发工作,提高效率,同时为开发者提供了一个可靠的通信框架。 ### 回答3: ucos-iii-tcpip.a是一个软件库,主要用于嵌入式系统中实现TCP/IP网络协议栈。它基于Micrium公司开发的uC/OS-III实时操作系统,提供了一套完整的TCP/IP协议栈的实现。该软件库的目标是为嵌入式系统开发人员提供一个方便快捷且可靠的TCP/IP协议栈,使他们能够更容易地将网络功能集成到嵌入式应用中。 ucos-iii-tcpip.a具有多线程处理能力,能够同时处理多个网络连接和数据包,提供了 TCP、UDP、IP、ICMP等网络协议的实现。它支持IPv4和IPv6协议,可以实现IP地址的分配和路由功能,支持网络数据包的传输和接收,还提供了socket API接口供应用程序调用。 使用ucos-iii-tcpip.a,嵌入式系统开发人员可以方便地添加网络功能到他们的嵌入式应用中,无需从头开始开发TCP/IP协议栈,大大加快开发进度。在嵌入式系统中,网络功能往往是非常重要的,通过使用ucos-iii-tcpip.a,开发人员可以轻松实现远程控制、数据采集、与外部设备通信等功能。 总之,ucos-iii-tcpip.a是一个基于uC/OS-III实时操作系统的TCP/IP协议栈软件库,提供了完整的TCP/IP协议栈的实现,方便嵌入式系统开发人员快速添加网络功能到他们的应用中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值