IOT安全基础知识
IOT介绍
物联网架构分为:移动,云,设备
分层模型
1、传感层
由硬件传感器和传感器网络组成
2、通信层
由通信机制组成,该机制允许传感器与管理层进行通信,例:Wi-Fi,3G,LTE,以太网等
3、管理层
负责从原始数据中弄清楚意义,并为用户提供可呈现的视图,包括云,存储,应用
IOT相关技术
射频识别(RFID)
无线传感网络(WSN)
IOT相关协议
常见协议:
CoAP,MQTT,AMQP,WebSocket,CANbus,Modbus,Profibus,DNP3,BACNet,HL7,XMPP,UPnP,DNS,SSH
IOT常用通讯协议:
WIFI,BLE,ZigBee,ZWave,6LowPAN,蜂窝数据等
逆向基础
ARM
ARM处理模式
用户模式:user,ARM处理器正常的程序执行状态
快速中断模式:FIQ,用于高速数据传输或通道处理
外部中断模式:IRQ,用于通用的中断处理
管理模式:SVC,操作系统使用的保护模式
数据访问中止模式:Abort,数据或指令预取终止时进入该模式,用于虚拟存储及内存保护
系统模式:System,运行具有特权的操作系统任务
未定义指令中止模式:Undifined,当未定义指令运行时进入该模式,可用于支持硬件协处理器的软件仿真
协处理器:协助中央处理器完成其无法执行或执行效率低下的处理工作而开发和应用的处理器
寄存器
寄存器 | 用途 |
---|---|
R0 | 函数第一个参数 |
R1 | 函数第二个参数 |
R2 | 函数第三个参数 |
R3 | 函数第四个参数 |
R4 | |
R5 | |
R6 | |
R7 | 函数调用中存储系统调用号 |
R8 | |
R9 | |
R10 | |
R11 | 记录回溯信息,也可以当作局部变量使用 |
R12 | |
R13 | SP(堆栈指针),指向栈顶 |
R14 | LR(链接寄存器),在进行函数调用时,LR内保存调用函数的下一条指令地址,用于被调用函数(子函数)结束工作后返回调用函数(父函数) |
PC | PC(程序计数器),类似EIP,用于存储当前指令+8的地址 |
指令集
指令 | 功能 | 指令 | 功能 |
---|---|---|---|
MOV | 移动数据 | EOR | 按位异或 |
MVN | 移动数据并取反 | LDR | 加载 |
ADD | 加法 | STR | 存储 |
SUB | 减法 | LDM | 加载多个 |
MUL | 乘法 | STM | 存储多个 |
LSL | 逻辑左移 | PUSH | 入栈 |
LSR | 逻辑右移 | POP | 出栈 |
ASR | 算术右移 | B | 跳转 |
ROR | 右旋 | BL | Link+分支跳转 |
CMP | 比较 | BX | 分支跳转 |
AND | 按位与 | BLX | Linx+分支跳转 |
ORR | 按位或 | SWI/SVC | 系统调用 |
LDR:用于将某些内容加载到寄存器中,例:LDR R2, [R0] 从R0寄存器中存储的内存地址的值读入R2寄存器
STR:用于将某些内容从寄存器存储到内存地址中,例:STR R2,[R1] 从R2寄存器中将值存储到R1寄存器中的内存地址中
MIPS
寄存器
通用寄存器(GPR)
在MIPS架构中有32个通用寄存器,在汇编程序中使用编号$0~$31表示
编号 | 寄存器名称 | 寄存器描述 |
---|---|---|
0 | zero | 始终为0 |
1 | $at | 保留寄存器 |
2~3 | $v0~$v1 | 保存表达式或者程序返回结果 |
4~7 | $a0~$v3 | 函数调用的前4个参数 |
8~15 | $t0~$t7 | 临时寄存器 |
16~23 | $s0~$s7 | 子函数使用时需要先保存原寄存器的值 |
24~25 | $t8~$t9 | 临时寄存器,扩展t0-t7 |
26~27 | $k0~$k1 | 保留,中断处理函数使用 |
28 | $gp | 全局指针 |
29 | $sp | 堆栈指针,指向堆栈的栈顶 |
30 | $fp | 保存栈指针 |
31 | $ra | 保存返回地址 |
特殊寄存器
PC:程序计数器
HI:乘除结果高位寄存器
LO:乘除结果低位寄存器
在进行乘法运算时,HI存储高32位,LO存储低32位
在进行除法运算时,HI保存余数,LO存储商
指令集
MIPS固定5字节指令长度
内存中的数据访问(load/store)必须至少4字节对齐
LOAD/STORE指令:
lb,lbu,lh,lhu,ll,lw,lwl,lwr,sb,sc,sh,sw,swl,swr,move
l开头:加载指令
s开头:存储指令
move:寄存器之间的值的传递
算术运算指令:
add,addi,addiu,sub,subu,clo,clz,slt,slti,sltiu,sltu,mul,mult,multu,madd,msub,msubu,div,divu
类比较指令:
slt,slti,sltiu,sltu
SYSCALL(SYStem CALL):
SYSCALL可以产生一个软中断,实现系统调用==》
系统调用号存放在$v0中,参数存放在$a0~$a3中==》
系统调用的返回值通常放在$v0中
若系统调用出错==》在$a3中返回一个错误号
分支跳转指令:
分支跳转指令本身可以通过比较两个寄存器中的值来决定是否进行跳转
指令格式 | 描述 |
---|---|
b target | 无条件跳转至target |
beq $t0,$t1, target | 如果$t0 == $t1,跳转 |
blt $t0,$t1, target | 如果$t0 < $t1,跳转 |
ble $t0,$t1, target | 如果$t0 <= $t1,跳转 |
bgt $t0,$t1, target | 如果$t0 > $t1,跳转 |
bge $t0,$t1, target | 如果$t0 >= $t1,跳转 |
bne $t0,$t1, target | 如果$t0 != $t1,跳转 |
跳转指令:
指令格式 | 描述 |
---|---|
j target | 无条件跳转 |
jr $t3 | 跳转至$t3寄存器指向的地址处 |
jal target | 跳转,并保存返回地址至$ra中 |
子函数调用:jal sub_xxx
首先复制当前的PC值至$ra寄存器中(当前PC为子函数执行完毕后的返回地址)
==》程序跳转
子函数返回:jr $ra
若子函数中又调用了其他子函数==》$ra的值被保存在堆栈中(当前子函数的返回地址)
注意点:
MIPS没有栈底指针,需要通过SP指针
函数调用:在进入函数三个时将当前栈指针向下偏移n byte到该函数的stack frame存储空间
函数返回:加上偏移量恢复栈指针
MIPS架构在调用函数会把返回地址存入t9寄存器,后赋值给RA
在本函数为叶子函数时,RA寄存器不会入栈
在本函数为非叶子函数时,RA寄存器入栈==》可以通过栈溢出来劫持控制流
传参:前4个参数存放在$a0 - $a3,其他的参数会保存在调用函数的预留的栈顶空间中
叶子函数与非叶子函数:
叶子函数:在该函数中不再调用其他函数的函数
非叶子函数:不调用其他函数的函数就是非叶子函数
void A(int *a,int *b){
int tmp(0);
tmp=a;
a=b;
b=tmp;
}
void B(){
int a(0),b(13);
A(a,b);
}
A为叶子函数,B为非叶子函数
B函数在执行到调用A函数时,先复制$PC寄存器的值到$RA,然后跳转至A函数
在函数返回时==》A是叶子函数==》使用jr $ra返回B
若是非叶子函数返回==》先从堆栈中取出返回值,存放至$ra中,之后使用jr $ra返回
IOT协议介绍
- CoAP – https://en.wikipedia.org/wiki/Constrained_Application_Protocol
- MQTT – https://en.wikipedia.org/wiki/MQTT
- AMQP – https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol
- WebSocket – https://en.wikipedia.org/wiki/WebSocket
- CANbus – https://en.wikipedia.org/wiki/CAN_bus
- Modbus – https://en.wikipedia.org/wiki/Modbus
- Profibus – https://en.wikipedia.org/wiki/Profibus
- DNP3 – https://en.wikipedia.org/wiki/DNP3
- BACNet – https://en.wikipedia.org/wiki/BACnet
- HL7 – https://zh.wikipedia.org/wiki/Health_Level_7
- XMPP – https://en.wikipedia.org/wiki/XMPP
- UPnP – https://en.wikipedia.org/wiki/Universal_Plug_and_Play