ARM PWN基础教程

打印 上一主题 下一主题

主题 874|帖子 874|积分 2622

一、前言

在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右旋BLLink+跳转CMP比较BX分支跳转AND按位与BLXLinx+分支跳转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
  1. 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  |
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表