【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

这篇具有很好参考价值的文章主要介绍了【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在最前:一定要先将task3.sct文件链接到项目中,具体操作后文有写,而且我在附加内容里解释了sct文件的含义。

终于可以告别这个实践了。大家在心得里可以加一句“任务量较大,建议减少任务量”吗?

实验三 FreeRTOS-MPU 保护绕过

实验要求

MPU预设置:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

a) 编写 C 代码实现基于 FreeRTOS-MPU v10.4 的提权代码和指定函数查找
b) 利用溢出漏洞实现在 FreeRTOS MPU V10.4 版本的系统提权和 Flag 函数打印

子任务1

首先,和上一个实验相似地,也是看一下.c文件的结构。

main函数:
① 定义无符号整型变量id,赋值为学号末4位;
② 调用prvSetupHardware(),硬件初始化;
③ 调用StartFreeRTOS(id, vTask3)
④ 使用for(;;)让程序不退出。

vTask3的内容,只有for(;;)

头文件和lib文件的作用与上一个实验差不多。

因此,所有任务要求都集中在StartFreeRTOS里了,我们需要进行进一步的逆向分析。

逆向分析StartFreeRTOS

IDA Pro打开并反编译StartFreeRTOS如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

可以看到,该函数大致有如下几个操作:

① 将byte_7714的地址指向的内容拷贝给任务参数xTask3Parameters
② 设置任务参数xTask3Parameters的函数指针为vTask3
③ val *= id;
④ 调用xTaskCreateRetricted,结合任务参数xTask3Parameters创建被约束的任务;
⑤ 调用vTaskStartScheduler()启动任务序列。

我们要做的是在vTask3中调用提权函数,然后再调用打印flag的函数。

打印flag的函数好找,直接在IDA Pro的字符串窗口找就行,找到后双击点开,再查看引用:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

总之能找到一个叫vTaskRemove的函数,它是无参数函数,能够打印flag。

找提权函数,我一开始完全不知道怎么找。
直到看了下实验讲解的PPT,看到了下面这张图:
【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

可见,如果普通任务要使用内核API,不能直接使用,而是要添加MPU_,添加了这个的函数,其中包含提权操作。而且,提权操作应该是利用SVC中断。

因此,我们不妨在IDA Pro中随便打开一个MPU_的函数逆向分析一下,找到其中的提权操作。我以MPU_vTaskDelete为例。IDA Pro中分析如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

上图中我框出来的就是提权操作。可以看到,就是先做了些进入函数的压栈操作,随后把要提权的Task传入R4,如果R4不为0就跳转提权函数(如果为0那么本身就是特权级)。然后再常规地执行xTaskDelete这个内核API。

很明显,提权函数就是xPortRaisePrivilege,而且利用寄存器R4传参,所以它也是个无参数的函数。

先不急着把地址填入,因为这个地址在修改了vTask3内容之后会发生改变。先假装已经找到了地址,并在vTask3中使用地址调用这些函数,这样,找到之后就只需要修改成对应的地址。添加代码如下:

注意,随便填的地址不得为全零、不得相同,最好是填得像一点,否则二度修改后,地址又会变化。

void (*pPrivilege)();
void (*pFunc)();
pPrivilege=(void(*)())0x00001051;
pFunc=(void(*)())0x000029AD;
pPrivilege();
pFunc();

Rebuild后,去IDA Pro中查找函数地址。在使用地址调用函数的时候,需要加一。

需要注意的是,当函数地址已经添加正确,但log.txt中却连vTask3都没有的时候,很可能是项目的配置出了问题,如内存地址分布,出问题的log.txt如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

此时必须要导入老师发的task3.srt,导入方式如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

导入完成后,重新构建项目,并重新逆向分析地址。(我导入后重新截了一遍图)

sct具体的作用见下文的附加内容1

打印 Flag 函数名称和地址

名称:vTaskRemove
地址:0x000005F4

内容如下图所示:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

用于提权的函数名称和地址

名称:xPortRaisePrivilege
地址:0x00008EDC

内容如下图所示:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

填写的代码

注意,需要将上述找到的地址加1后再调用。填写的代码如下图所示:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

模拟运行截图

运行并打印flag的结果如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

log.txt如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

之所以要把log.txt也截图出来,是因为之前分析的时候,可以看到xPortRaisePrivilege函数提权的任务是R4寄存器,而我们只是简单地调用了该函数,并未对R4寄存器做处理。可是也成功了。
查看log.txt会发现,并没有明显的对R4寄存器处理的内容,最近一次赋值是prvSVCHandler的pop。我猜测有可能只需要执行svc 2中断即可提权,具体情况尚未明确,不过对本实验无任何影响。

后来写flag5报告的时候,意识到当R4为0时,提权的应该就是本任务;或者,不论R4的取值,都会对本任务提权。

附加内容1:sct文件的作用

下图左是老师发的sct文件,下图右是软件自动生成的sct文件。

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

sct文件也就是内存映射布局文件。
一般情况,编译的时候,只是让所有的函数(如上图中的.ANY (+R0))按照函数名称排序放进内存里,并没有所谓特权访问还是用户访问的访问控制。
在我们设置了MPU之后,编译并不会跟着受影响。因此,非特权函数可能就放入了我们自己规定的MPU中特权函数的那个区域,非特权函数保存在了特权函数的地址范围,MPU就不会允许执行了。

而老师修改后的sct文件,对API的位置重新布局,把特权函数privileged_functions放到了第一段(就是MPU中只允许特权执行的那个位置ER_IROM1),把其他的放到了ER_IROM2。并把特权数据privileged_data放到了MPU中只允许特权可读写的段RW_IRAM1,把其他的放到了RW_IRAM2

这样,就会让内存映射与MPU设置一致了。

子任务2

逆向分析StartFreeRTOS

该任务逆向分析函数地址与上一个任务相似,在此不做赘述。

打印 Flag 函数名称和地址

名称:vTaskDelayBackup
地址:0x00001C7C

内容如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

用于提权的函数名称和地址

名称:xPortRaisePrivilege
地址:0x000086E2

内容如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

分析过程

该文件的main函数超长,不过很简单,如下图所示:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

暂时只能看到,最后输入的字符串InputBuffer长度最大为0x63。

再点开StartFreeRTOS:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

只是运行了受约束的vTask3任务,其他啥也没干。

由于这是传参传进来的,不能直接点开,所以先返回上一级,然后再点开vTask3任务:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

vTask3调用了Function(),根据经验,这就是出问题的代码了。

找到存在在溢出的缓冲区

点开Function

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

发现居然Function传进来了参数,更重要的是出现了lengthInputBuffer,而且赋值给HelperBuffer,并且HelperBuffer的大小只有12,说明HelperBuffer可能就是溢出的缓冲区。

以汇编形式显示Function函数如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

对PUSH和POP的解释:ARM架构的栈是递减栈,PUSH的时候从右至左,POP的时候从左至右。

查看汇编之后,会发现其实严格来说,压根就没有什么溢出缓冲区。Function函数,它先push了4个寄存器,然后在函数的最开始使用mov buffer, sp,直接改变栈顶指针sp,接下来立马用InputBuffer的内容逐一填充buffer(在我的IDA中该变量名被解析成HelpBuffer)。最后pop的时候,pop的内容不就是HelpBuffer[0]HelpBuffer[1]HelpBuffer[2]等吗?
覆盖寄存器的值,就是Function的目的,也是设置buffer的作用,它就是想往栈上写、往寄存器上写。
既然,该缓冲区的每一个比特,目的都是向不应该写的寄存器或栈上写数据,它就压根没有与正常功能有关的部分。就像拿一张纸画画,正常操作画在纸上,但是涂多了就溢出到桌上了,这张纸叫做溢出缓冲区;而这个代码就是连纸都没有。

综上,我认为这并不是一个典型的缓冲区溢出代码。如果非要说有个溢出缓冲区,那就是故意构造的这个HelpBuffer,而且该溢出缓冲区的长度为0,没有正常功能

栈示意图

点开Function的bp,可以看到IDA Pro中的栈帧。

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

不过,这并不能很好地解释栈中的内容。我重新绘制了栈示意图。

当执行mov buffer, sp前后的栈示意图如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

LR(Function)需要覆盖成提权函数,而调用提权函数之后,还需要调用打印flag的函数,所以还要构造溢出提权调用的返回地址的栈结构。完全构造完毕的栈示意图在后续“溢出提权”中会画出

溢出提权

溢出提权调用xPortRaisePrivilege,地址是0x000086E2。该函数第一行是PUSH {xRunningPrivileged,LR}。如果执行这一句,就会改变我们已经构造好的栈帧结构,也会导致返回地址无法被覆盖,因此需要跳过这一句,从地址0x000086E4开始。再加上基地址是1,因此LR(Function)需要被覆盖成0x000086E5

顺利进入并执行提权函数后,还要继续执行打印flag的函数。返回时执行了POP {xRunningPrivileged,LR}因此需要构造8个HelpBuffer字节,完整的栈示意图如下:

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

覆盖返回地址的解析过程

Function中返回值被覆盖成xPortRaisePrivilege第二行地址加1,即0x000086E5,因此它返回时会从xPortRaisePrivilege的第二行代码开始执行,并完成提权;

xPortRaisePrivilege中返回值被覆盖成vTaskDelayBackup地址加1,即0x00001C7C,因此它返回时会从vTaskDelayBackup的第一行代码执行,并完成flag打印。

模拟运行截图

【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

完结撒花!!!文章来源地址https://www.toymoban.com/news/detail-489669.html

到了这里,关于【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络安全 | 揭秘网络安全攻防实战:探索互联网发展史,守护数字世界的安全堡垒

    大家好,我是沐尘而生。 互联网发展史:数字世界的壮阔画卷 从早期的ARPANET到今天的万物互联,互联网经历了漫长的发展过程。然而,随着技术的进步,网络安全问题也随之而来。我们不仅要探索互联网的壮阔历程,更要理解其中的安全挑战。 网络攻防实战:保卫数字领域

    2024年02月13日
    浏览(66)
  • 网络安全实验室|网络信息安全攻防学习平台(脚本关1-6)

    传送门: http://hackinglab.cn/ 点击此处开启抓包,send ti repeater 模块 脚本来源: https://blog.csdn.net/hzxtjx/article/details/125692349 使用requests库向网站发送HTTP请求,并使用re模块使用正则表达式从网站的HTML内容中提取信息。所选的代码块定义了一个正则表达式模式r’/n(.*?)=i’。此模式

    2024年02月08日
    浏览(77)
  • 网络安全攻防实验:WPA-PSK口令攻击

    目录 前言 一、实验原理 二、使用步骤 1.环境搭建 2.查看四个消息包 注:使用eapol筛选出四个包 ​编辑 查看Message1​编辑 查看Message2 查看Message3 查看Message4 3.使用程序破解口令 1)       掌握WLAN的工作原理; 2)       理解RSN的密钥层次; 3)       理解4次握手原理

    2023年04月08日
    浏览(53)
  • 虚拟网络设备与网络安全:深入分析与实践应用

    在数字化时代📲,网络安全🔒成为了企业和个人防御体系中不可或缺的一部分。随着网络攻击的日益复杂和频繁🔥,传统的物理网络安全措施已经无法满足快速发展的需求。虚拟网络设备🖧,作为网络架构中的重要组成部分,通过提供灵活的配置和强大的隔离能力🛡️,

    2024年04月10日
    浏览(65)
  • 是否为网络设备设置了统一的安全技术标准和最佳实践?

    防火墙策略管理与安全技术标准及最佳实践的探讨 随着信息化技术的快速发展以及企业、组织的业务规模不断扩展,网络安全已经成为了大家越来越关注的话题。防火墙作为一种基础的网络安全防护措施,其策略管理的重要性不言而喻。然而,在网络设备中设置统一的安全技

    2024年04月09日
    浏览(51)
  • AD域安全攻防实践(附攻防矩阵图)

    以域控为基础架构,通过域控实现对用户和计算机资源的统一管理,带来便利的同时也成为了最受攻击者重点攻击的集权系统。 01、攻击篇 针对域控的攻击技术,在Windows通用攻击技术的基础上自成一套技术体系,将AD域攻防分为信息收集、权限提升、凭证窃取、横向移动、权

    2024年01月19日
    浏览(40)
  • STM32+ESP8266(AT固件)连接阿里云物联网 保姆级教学(附代码)--1.创建产品和设备

    提示:这里是从实际应用如何使用教学配置,未从原理讲解,适合小白从零开始到成功,比较有成就感 STM32+ESP8266(AT固件)连接阿里云物联网系列保姆级教学 1. 创建产品和设备 2. 设置产品Topic数据和功能定义设备物模型数据显示 3. 硬件连接+代码修改 4. Web数据可视化 5.功能

    2024年04月25日
    浏览(89)
  • 【网络攻防技术】实验八——SQL注入实验

    SQL注入是一种代码注入技术,它利用web应用程序和数据库服务器之间接口中的漏洞。当用户的输入在发送到后端数据库服务器之前未在web应用程序中正确检查时,就会出现此漏洞。许多web应用程序从用户处获取输

    2024年02月08日
    浏览(34)
  • 网络安全与攻防-常见网络安全攻防

    目录 攻击手段防御策略 阻断服务攻击(DoS) 地址解析欺骗(ARP攻击)(Address Resolution Protocol spoofing) 跨站脚本攻击(XSS) SQL注入 跨站请求伪造(csrf)  HTTPS中间人攻击 小结 阻断服务攻击(DoS) 阻断服务攻击(Denial-of service attack),想办法将目标网络资源用尽(自己的服

    2023年04月25日
    浏览(68)
  • 作业实践一 网络攻防环境的搭建,20222927

    网络攻防实践以网络攻防环境的搭建为基础,在有限的资源环境条件下,搭建一个专属于自己的网络攻防实验环境,可以进行控制及重复的网络攻防技术实验与实践活动,使得对相关的基础知识与底层机制、攻防技术方法有更深入的理解,并掌握攻防技术技能。网络攻防环境

    2024年02月05日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包