IOT安全基础知识
2022-09-05 20:46:57

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协议介绍

  1. CoAP – https://en.wikipedia.org/wiki/Constrained_Application_Protocol
  2. MQTT – https://en.wikipedia.org/wiki/MQTT
  3. AMQP – https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol
  4. WebSocket – https://en.wikipedia.org/wiki/WebSocket
  5. CANbus – https://en.wikipedia.org/wiki/CAN_bus
  6. Modbus – https://en.wikipedia.org/wiki/Modbus
  7. Profibus – https://en.wikipedia.org/wiki/Profibus
  8. DNP3 – https://en.wikipedia.org/wiki/DNP3
  9. BACNet – https://en.wikipedia.org/wiki/BACnet
  10. HL7 – https://zh.wikipedia.org/wiki/Health_Level_7
  11. XMPP – https://en.wikipedia.org/wiki/XMPP
  12. UPnP – https://en.wikipedia.org/wiki/Universal_Plug_and_Play