ToB企服应用市场:ToB评测及商务社交产业平台
标题:
ARM PWN基础教程
[打印本页]
作者:
千千梦丶琪
时间:
2022-8-29 13:19
标题:
ARM PWN基础教程
一、前言
在CTF比赛中,我们所能接触到的大部分都是x86、x86_64架构的题目,而在我开始接触IOT方向的研究以后发现智能设备所用到的则是ARM和MIPS架构为主。本篇文章在介绍前置知识的基础上通过CTF的ARM架构类型题带读者更好的入门ARM PWN的世界。
二、前置知识
指令集
Intel和ARM之间的区别主要是指令集,Intel采用复杂指令集而ARM则是精简指令集,精简指令集通过减少每条指令的时钟周期来缩短执行时间可以更快的执行指令,但因为指令较少因此在实现功能时会显得比Intel冗长。
寄存器
寄存器是ARM架构的一个重点,在x86架构上指令可以直接对内存的数据进行操作,而在ARM架构中必须将内存的数据放入寄存器中再进行操作。而寄存器的数量取决于ARM的版本,而ARM32架构下共30个寄存器:
R0在常规操作中可用于存储临时值,也可以用于存储函数的第一个参数或返回结果
在ARM架构中约定指定函数前四个参数存储在R0~R3寄存器中
R7寄存器在函数调用中负责存储系统调用号
R11寄存器即可以用来记录回溯信息,也可以当做局部变量来使用
R13寄存器SP(堆栈指针)指向堆栈的顶部
R14寄存器LR(链接寄存器)在进行函数调用时,LR寄存器内保存调用函数的下一条指令地址,用于被调用函数(子函数)结束工作后返回调用函数(父函数)
R15寄存器PC(程序计数器)类似于X86架构下的EIP寄存器负责保存目标地址,与x86不同的点在于PC在ARM状态下存储当前指令+8的地址。
[img=700,528.3980582524272]https://www.hetianlab.com/headImg.action?news=c24ceab6-345c-42b0-83fd-6f852e34afdd.png[/img]
ARM指令
这里引用
eack
师傅在ARM基础知识PPT中所列出指令的表格,在有了X86架构的基础后去看下面这些指令还是很好理解的。
指令功能指令功能
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和STR两个指令
LDR用于将某些内容从内存加载到寄存器中,例如LDR R2, [R0]从R0寄存器中存储的内存地址的值读入R2寄存器
STR用于将某些内容从寄存器存储到内存地址中,例如STR R2, [R1]从R2寄存器中将值存储到R1寄存器中的内存地址中
三、例题讲解
这里以jarvisoj 的 typo 例题进行讲解,题目可通过下方链接获得
https://github.com/ctf-wiki/ctf-challenges/blob/master/pwn/arm/jarvisOJ_typo/typo
查看题目保护,arm-32-little架构的静态链接文件未开启PIE和Canary保护,存在NX保护无法同时写入shellcode来getshell
amalll@A-M:~/AM$ checksec pwn<br>[*] '/home/amalll/AM/pwn'<br> Arch: arm-32-little<br> RELRO: Partial RELRO<br> Stack: No canary found<br> NX: NX enabled<br> PIE: No PIE (0x8000)<br>amalll@A-M:~/AM$ file pwn<br>pwn: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=211877f58b5a0e8774b8a3a72c83890f8cd38e63, stripped
复制代码
因为程序去除了符号表的关系,我们可以使用rizzo插件来恢复符号表,可以从程序中发现system和/bin/sh等关键信息地址,同时在跟随程序流程注意到一处很明显的栈溢出漏洞,getshell所需的条件都满足了。
[img=720,381.62883845126834]https://www.hetianlab.com/headImg.action?news=ef5e67cf-1d7c-4f78-9604-99eec3735d26.png[/img]
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)
这边的利用思路就是通过栈溢出漏洞覆盖程序的返回地址,在ARM架构下是覆盖要POP给PC寄存器的地址值,覆盖为一段可以同时控制R0和PC寄存器的GADGET,因为在ARM架构下函数约定R0寄存器作为函数的第一个参数存储,所以我们可以控制R0寄存器指向/bin/sh地址,PC寄存器指向system函数的地址,即可GetShell。
[code]+-------------+
| "a" * 112 |
+-------------+
| pop_gadget |
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4