第四章 物联网固件层安全讲解
0x01 文件系统详解
1. 文件系统简介
1.1 文件系统简介
文件系统是操作系统用于明确存储设备(常见是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。
研一入学时学习了看雪上的课程《物联网安全入门》,大半年过去了已经忘的差不多了,去年已经边看边学也记了一些零碎的笔记,最近花了一周时间把以前的笔记给尽量完善一下,也算是进行一下系统的复习。
此系列参考自《物联网安全入门》,这门课个人感觉更像是一个扫盲课(毕竟是入门课程),让你对物联网(安全)的整体有一个大致了解,但具体到某一部分,还是不够详细,还需要在查阅其他资料来补相关的知识。
笔记根据课程目录,大致分为8个章节:
第一章:逆向基础
第二章:PWN基础
第三章:物联网硬件层安全讲解
第四章:物联网固件层安全讲解
第五章:物联网嵌入式Web
第六章:物联网架构之物联网协议
第七章:物联网渗透测试之移动应用
第八章:物联网安全防护
题目链接:https://ropemporium.com/challenge/ret2csu.html
参考博客:https://blog.csdn.net/Ga4ra/article/details/123791650
根据题目名称以及给出的提示,明显我们需要使用ret2csu,有关ret2csu的知识移步《看雪pwn入门篇》或者直接百度。这里我们还是按照常规思路来分析下。
flex是flexible Box的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为flex布局。
采用Flex布局的元素,称为Flex容器(flex container),简称“容器”。它所有的子元素自动成为容器成员,称为Flex项目(flex item),简称“项目”。
总结:flex布局原理就是通过给父盒子添加flex属性,来控制子盒子的位置和排列方式。
以下6个属性是对父元素设置的
在flex布局中,是分为主轴和侧轴两个方向的,同样的叫法有:行和列、x轴和y轴
flex-direction属性决定主轴的方向(即项目的排列方向)
注意:主轴和侧轴是会变化的,就看flex-direction设置谁为主轴,剩下的就是侧轴,而我们的子元素是跟着主轴来排序的。
属性值 | 说明 |
---|---|
row | 默认从左到右 |
row-reverse | 从右到左 |
column | 从上到下 |
column-reverse | 从下到上 |
justify-content属性定义了项目在主轴上的对齐方式
注意:使用这个属性之前一定要确定好主轴是哪个?
属性值 | 说明 |
---|---|
flex-start | 默认从头开始,如果主轴是x轴,则从左到右 |
flex-end | 从尾部开始排列 |
center | 在主轴居中对齐(x轴:水平居中) |
space-around | 平分剩余空间 |
space-between | 先两边贴边再平分剩余空间(重要) |
默认情况下,项目都排在一条线上(又称为:轴线)。flex-wrap属性定义,flex布局中默认是不换行的。
属性值 | 说明 |
---|---|
nowrap | 默认值;不换行 |
wrap | 换行 |
该属性是控制子项在侧轴(默认是y轴)上的排列方式,在子项为单行的时候使用
属性值 | 说明 |
---|---|
flex-start | 默认值,从上到下 |
flex-end | 从上到下 |
center | 挤在一起居中(垂直居中) |
stretch | 拉伸(不要给子盒子高度) |
设置子项在侧轴上的排列方式,并且只能用于子项出现换行的情况(多行),在单行下是没有效果的。
属性值 | 说明 |
---|---|
flex-start | 默认值在侧轴的头部开始排列 |
flex-end | 在侧轴的尾部开始排列 |
center | 在侧轴中间显示 |
space-around | 子项在侧轴平分剩余空间 |
space-between | 子项在侧轴先平分在两头,再平分剩余空间 |
stretch | 设置子项元素高度平分父元素高度 |
align-content和align-items区别
flex-flow属性是flex-direction和flex-wrap的复合属性。
1 | flex-flow: row wrap; |
flex属性定义子项目分配剩余空间,用flex来表示占多少份数
1 | .item { |
align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。
默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
order属性定义项目的排列顺序
数值越小,排列越靠前,默认为0
注意:与z-index不一样
题目链接:https://ropemporium.com/challenge/pivot.html
根据题目提示,我们需要进行栈迁移,因为留给我们的溢出长度太短了,不足以存放一个完整的ROP链。同时,题目还提示我们,程序中导入了链接库libpivot32.so
中的foodhold_function
函数,并且ret2win
函数也被包含在链接库中。根据前几个挑战的经验和题目的提示,我们可以猜到,需要用到ret2libc技术,调用链接库中的ret2win
函数,拿到flag。
Note:有关栈迁移技术和ret2libc技术的介绍请查看PWN入门中的相关讲解,此处默认已经了解这两种技术。
思路不难想,跟write4一样的思路,只是构造ROP链时,需要用到一些偏僻的汇编指令,构造起来比较麻烦。
详细过程请参考这篇博客:https://bbs.kanxue.com/thread-272054.htm
题目链接:https://ropemporium.com/challenge/badchars.html
根据题目描述可知,我们往栈中的输入会有一些坏字节,在我们查找偏移量的过程中就会遇到。