IOT pwn,2024年五面蚂蚁

之后就可以通过 scp 向虚拟机传文件或者 ssh 登录虚拟机。

sudo apt install sshpass
sshpass -p root scp squashfs-root.tar.xz root@192.168.2.2:~
sshpass -p root ssh root@192.168.2.2

binwalk

一个分析和解压固件的工具。

sudo apt install binwalk -y

binwalk 使用 -e 参数可以解压固件。注意新版的 binwalk 为了安全会将符号链接到具体设备的链接修改为链接到 /dev/null ,因此需要添加 --preserve-symlinks 参数。

  • 固件扫描

binwalk 固件名称

  • 固件提取

binwalk -e 固件名称

  • 固件递归提取

binwalk -Me 固件名称

另外需要安装 sasquatch 用于对非标准的 SquashFS 格式的文件镜像进行解压。

git clone https://github.com/devttys0/sasquatch.git
cd sasquatch
wget https://github.com/devttys0/sasquatch/pull/47.patch
patch -p1 < 47.patch
sudo ./build.sh

Firmadyne

在这里插入图片描述
Firmadyne 是一个自动化的固件识别与仿真的框架,FirmAE 是 Firmadyne 的改进版。

firmware-analysis-toolkit 是在 Firmadyne 的基础上开发的固件仿真框架。可以采用如下方法安装 firmware-analysis-toolkit 。

git clone https://github.com/attify/firmware-analysis-toolkit.git
cd firmware-analysis-toolkit
sudo ./setup.sh

之后配置 fat.config 文件,将 sudo_password 改成正确的值,firmadyne_path 不需要改。

仿真的方式是 fat.py + 固件的路径名

$ ./fat.py

在我的环境下使用 python3 fat.py <firmware file> 命令运行会出现固件解压失败的问题;<firmware file> 不使用绝对路径也会出错,需要注意一下。

运行后 FAT 能正常识别出网卡信息说明能够仿真成功,之后按回车键就可以把系统跑起来。
在这里插入图片描述

IoT-vulhub

一个存放复现 IOT 漏洞的 docker 环境的项目,由于其中内置的 docker 比较老外加 docker 本身的限制导致调试比较困难,但是项目本身搭建环境的思想还是值得学习的。

汇编基础

ARM32

关于汇编

由于 ida 对 arm 汇编进行了“美化”,因此我们通过 ida 看到的不是原生的 arm 汇编。这里我们借助 catstione 和 keystone-engine 库定义了几个辅助函数方便查看原生汇编。

from keystone import *
from capstone import *
import idc

asmer =Ks(KS_ARCH_ARM,KS_MODE_ARM)
disasmer=Cs(CS_ARCH_ARM,CS_MODE_ARM)

def disasm(machine_code, addr=0):
l = “”
for i in disasmer.disasm(machine_code, addr):
l += “{:8s} {};\n”.format(i.mnemonic, i.op_str)
return l.strip(‘\n’)

def asm(asm_code, addr=0):
l = b’’
for i in asmer.asm(asm_code, addr)[0]:
l += bytes([i])
return l

def get_disasm(addr):
return disasm(idc.get_bytes(addr, idc.next_head(addr) - addr), addr)

def get_asm(addr):
return asm(get_disasm(addr), addr)

def get_code(start, end):
cur = start
code = “”
while cur < end:
code += “0x%08x %s\n”%(cur, get_disasm(cur))
cur = idc.next_head(cur)
return code

寄存器和指令基本格式
寄存器
寄存器名称寄存器描述
R0函数的第1个参数, 以及保存函数返回的结果
R1 - R3保存函数的第2~4个参数
R4 – R8通用寄存器,其中R7在系统调用时存储调用号
R9平台相关
R10通用寄存器, 可用于保存局部变量
R11/FP栈帧指针, 用于记录栈帧
R12过程间调用, 保存函数及其调用的子函数之间的立即数
R13/SP栈指针, 指向栈顶
R14/LR链接寄存器, 用于保存子函数调用的返回地址
R15/PC程序计数器, 保存当前执行指令地址+8
CSPR当前程序状态寄存器

pwndbg 项目的 pwndbg/lib/regs.py 中可以修改寄存器显示。

arm = RegisterSet(
retaddr=(“lr”,),
flags={“cpsr”: arm_cpsr_flags},
gpr=(“r0”, “r1”, “r2”, “r3”, “r4”, “r5”, “r6”, “r7”, “r8”, “r9”, “r10”, “r11”, “r12”, “lr”),
args=(“r0”, “r1”, “r2”, “r3”),
retval=“r0”,
)

常用指令
指令描述指令描述
MOV移动数据EOR按位异或
MVN移动并取反LDR加载
ADDSTR存储
SUBLDM加载多个
MULSTM存储多个
LSL逻辑左移PUSH入栈
LSR逻辑右移POP出栈
ASR算术右移B跳转
ROR循环右移BL跳转并将返回地址保存到LR寄存器
CMP比较BX跳转并切换Arm/Thumb模式
AND按位与BLX跳转,保存返回地址,并切换ARM/Thubmb模式
ORR按位或SWI/WVC系统调用
总体设计和指令规格
  • 没有隐式内存操作指令
  • 0-3个操作数,内存操作数和立即数不能同时存在,内存操作数至多出现1次,寄存器操作数总在最前

特殊情况:

  • C标志位使用
  • 读PC寄存器
断点

在 IDA 调试中,无论是断点还是单步调试都是依靠 #UND 0x10 触发断点实现,且 IDA 调试器 无法分辨出改指令是否是自己设置的,在读取数据时会按实际情况返回数据。
该指令在 Arm 模式和 Thumb 模式的硬编码不同:

  • Arm 模式断点:F0 01 F0 E7
  • Thumb 模式断点:10 DE
PC寄存器相关指令
  • MOV PC, R0:相当于 PC = R0
  • MOV R0, PC
  • 在 Arm 模式中相当于 R0 = PC + 8
  • 在 Thumb 模式中相当于 R0 = PC + 4
  • LDR R0, [PC,#x]
    可以看做 3 步:
  • 读 PC 寄存器的值,规则与 MOV R0, PC 相同,即根据处于 Arm 或 Thumb 模式加上相应的偏移
  • 将读出的值再加上偏移 x 作为地址,然后将地址向下取整做 4 字节对齐
  • 从计算出的地址的值读入到 R0 寄存器中
条件和标志位响应
CPSR 寄存器

CPSR 寄存器结构如下图所示:
在这里插入图片描述
各标志位含义:

  • N,bit[31]
    若运算结果为 0 或正数则该该标志位置 0,若运算结果为负数则该标志位置 1 。
  • Z,bit[30]
    运算结果为 0 则置 1,否则置 0 。
  • C,bit[29]
    无符号数溢出,加法溢出置 1,减法溢出置 0
  • V,bit[28]
    有符号数溢出
  • T,bit[5]
  • T = 0 表示 Arm 模式
  • T = 1 表示 Thumb 模式。

注意:指令是否影响标志位取决于是否是否加 S 后缀(大多数情况,具体看指令硬编码第 20 位是否置 1),比如 MOV 不影响标志位但 MOVS 影响标志位。

执行条件

cond 标志的值及其对应含义如下表所示:
在这里插入图片描述
cond 标志位位于指令硬编码的高 4 比特,在执行时根据标志寄存器决定该指令是否执行。

MOV 指令

MOV 不访问内存,因此操作数只能是寄存器或立即数。

MOV 立即数

由于 ARM 汇编指令长度的影响,对立即数范围有严格的限制。允许 MOV 的立即数有如下几类:

  • 立即数不超过 16 位
    在这里插入图片描述
    该指令在给寄存器低 16 比特赋值的同时会将寄存器高 16 比特清零。
  • 立即数可以用 不超过8 比特的数循环右移不超过 32 的偶数得到
    在这里插入图片描述
    其中 imm12 中的低 8 比特是需要循环右移的数,高 4 比特乘 2 是需要循环右移的次数。
  • (MOVT)立即数不超过 16 位且需要移动到寄存器高 16 位(通常与 MOV 配合使且应当先 MOV 后 MOVT)
    在这里插入图片描述
    该指令在给寄存器高 16 比特赋值的同时不会将寄存器低 16 比特清零。
MOV 寄存器, 寄存器
  • 寄存器 + 立即数移位
    在这里插入图片描述
    例如 MOV R0, R1,LSL#4 ,该指令等同于 LSL R0, R1,#4
    移位类型由 stype 决定,移位的值为 imm5 。
  • 寄存器 + 寄存器移位
    在这里插入图片描述
    例如 MOV R0, R1,LSR R2 ,该指令等同于 LSR R0, R1,R2
基本整型运算
相关指令
  • ADD:加
  • ADR:PC 与操作数相加结果放入结果寄存器中
  • ADRL:伪指令,与 ADR 相似,不过通过类似 MOV + MOVT 的方式使得寻址范围更大
  • CMN:加,只影响标志寄存器
  • SUB:减
  • CMP:减,只影响标志寄存器
  • RSB :反减
  • AND:与
  • TST:与,只影响标志寄存器
  • BIC:第二个操作数与第三个操作数的反码逻辑与结果放在第一个寄存器中
  • ORR:或
  • EOR:异或
  • TEQ:异或,只影响标志寄存器
  • LSL:逻辑左移
  • LSR:逻辑右移
  • ASR:算术右移
ADD 指令(举例)
  • ADD 立即数
    在这里插入图片描述
    这里 12 比特长的立即数与前面 MOV 的机制一样,采用移位的方式将其扩展为 32 位范围。
  • ADD 寄存器,立即数移位
    在这里插入图片描述
    与 MOV 机制相同,例如 ADD R0, R1, R2,LSL #4
  • ADD 寄存器,寄存器移位
    在这里插入图片描述
  • ADR
    本质还是 ADD,不过被加数为 PC 寄存器。由于设计到读 PC 寄存器,因此根据当前所处的模式,读出来的 PC 寄存器的值会加上相应的偏移。
访存指令
数据流向
  • LDR:寄存器 ← 内存,例:ldr r0, [pc, #8]ldr r3, [r5], #4
  • STR:寄存器 → 内存,例:str r3, [r4]
操作的寄存器和内存地址
  • 寄存器:LDR R0, [R1]
  • 寄存器 + 偏移(立即数):LDR R0, [R1,#4]
    在这里插入图片描述
  • 12 位立即数即偏移,不存在移位扩展。
  • U 为立即数的正负号。
  • P = 0 则外偏移,W = 1 则内偏移,内外偏移不能同时存在。
  • 寄存器 + 移位偏移(寄存器):
  • LDR R0, [R1,R2,LSL #4]
    在这里插入图片描述
  • LDR R0, [R1,R2,LSL R3]
后续的附加行为
  • 内偏移:LDR R0, [R1,#4]!
    该指令表示将 [R1 + 4] 赋值给 R0 ,然后将 R1 的值设为 R1 + 4
  • 外偏移:LDR R0, [R1],#4
    该指令表示将 [R1] 赋值给 R0 ,然后将 R1 的值设为 R1 + 4

注意:外偏移和内偏移不能同时存在。

根据附加附加行为性质可知:

  • PUSH R0 相当于 STR R0, [SP,#-4]!
  • POP R0 相当于 LDR R0, [SP],#4
块访存指令
指令结构

LDM\STM+后缀 寄存器(!), {寄存器组}

  • LDM 表示将寄存器指向的地址的数据依次存放在寄存器组中。
  • STM 表示将寄存器组中的数据依次存放在寄存器指向的地址。
  • 寄存器组可以写作范围,比如 {R0-R4} ;也可指定具体寄存器,比如 {R0,R2,R3}。但是读写操作是按照寄存器下标的顺序依次操作寄存器组中的寄存器(编号小的在低地址),因为指令对应硬编码无法体现出寄存器组的顺序。

以 LDM 为例:
在这里插入图片描述

后缀类型

在这里插入图片描述

  • I 表示地址加;D 表示地址减。
  • A 表示先读写内存,再改变指向;B 表示先改变指向,再读写内存。
  • 带 ! 表示修改的指向写入寄存器;不带 ! 表示修改的指向不写入寄存器。
  • 如果操作地址寄存器为 SP 时LDMFD 相当于 LDMIA ;STMFD 相当于 STMDB 。

根据不同后缀类型的性质可以确定如下用法:

  • STMFD 相当于 PUSH
  • LDMFD 相当于 POP
  • STM\LDMIA 可以快速复制内存
分支和模式切换
B + imm

在这里插入图片描述

  • 跳转目标:立即数
  • 模式切换:不带模式切换
  • 写入 LR 的值:不影响 LR 寄存器

指令编码的立即数为目标地址与 PC 寄存器的差值除 4 。由于涉及读 PC 寄存器,因此根据当前模式要加上相应的偏移。跳转范围为 PC 值加上正负 32M 的偏移。

BL + imm

在这里插入图片描述

  • 跳转目标:立即数
  • 模式切换:不带模式切换
  • 写入 LR 的值:下一条指令的地址 | T 标志位
BX + reg

在这里插入图片描述

  • 跳转目标:寄存器中的值去掉最低一位
  • 模式切换:跳转时将寄存器中存储的地址的最低一位写入 T 标志位
  • 写入 LR 的值:不影响 LR 寄存器。
BLX + imm

在这里插入图片描述

  • 跳转目标:立即数
  • 模式切换:一定切换模式
  • 写入 LR 的值:下一条指令的地址 | T 标志位
BLX + reg

在这里插入图片描述

  • 跳转目标:寄存器中的值去掉最低一位
  • 模式切换:跳转时将寄存器中存储的地址的最低一位写入 T 标志位
  • 写入 LR 的值:下一条指令的地址 | T 标志位
拓展
  • BX regMOV PC, reg 的区别:BX 可以切换模式,MOV 不能切换模式。
  • LDR PC, [R0]:可以做模式切换,常用于 PLT 表中调用 GOT 表中对应的函数地址(最低位表示模式)。
  • LDMFD SP!, {R11,PC}:同样可以做模式切换,常与 STMFD SP!, {R11,PC} 一起用于函数调用时保存栈帧和返回地址。
Thumb 模式
特点
  • 段指令一般不使用 R8-R12
  • 一般没有条件码和标志响应位,指令默认影响标志位
  • 运算指令优先对第一,第二操作数相同情况有短指令编码。对于 STMFD 和 LDMFD,如果以 SP 寄存器的值作为地址则简写为 PUSH 和 POP 。
IT 块

在这里插入图片描述

结构如下图:

IT 指令的 mask 编码为从高到低,T 为 0,E 为 1 ,最后填一个 1 表示结束。比如 ITTEE EQ 的 mask 的二进制形式为 0111

调用约定
  • 前 4 个参数:R0-R3,其它参数栈传递
  • 非异变寄存器:R4-R11,使用此类寄存器的函数负责恢复寄存器原来的值。
  • R11/FP:栈帧指针,类似 EBP。
  • R12:导入表寻址

函数示例:

0x00010570 push {fp, lr}; ; 保存 FP 和 LR 寄存器,其中 FP 寄存器在栈顶。
0x00010574 add fp, sp, #4; ; FP 寄存器指向保存返回地址的位置。
0x00010578 sub sp, sp, #0x20; ; 抬升栈顶,开辟栈空间。
0x0001057C sub r3, fp, #0x24; ; R3 寄存器指向局部变量 char s[0x24] 开头,也就是栈顶。
0x00010580 mov r2, #0x20; ; memset 参数3
0x00010584 mov r1, #0; ; memset 参数2
0x00010588 mov r0, r3; ; memset 参数1
0x0001058C bl #0x10410; ; 调用 memset@plt
0x00010590 ldr r0, [pc, #0x40]; ; 由于是 ARM 模式,因此是取 0x00010590 + 8 + 0x40 = 0x000105D8 地址处的值。考虑到 ARM 的访存能力,编译器会为每个函数创建一个地址表来记录全局变量的地址。
0x00010594 bl #0x103d4; ; 调用 puts@plt
0x00010598 ldr r0, [pc, #0x3c];
0x0001059C bl #0x103d4;
0x000105A0 ldr r0, [pc, #0x38];
0x000105A4 bl #0x103d4;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
[外链图片转存中…(img-P5QaaZMq-1712664259139)]

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-VpFtjIlk-1712664259139)]

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值