> w0lfzhang@HatLab
[TOC]
## PowerPC 概述
> PowerPC(Performance Optimization With Enhanced RISC – Performance Computing,有时简称 PPC)是一种精简指令集(RISC)架构的中央处理器(CPU),其基本的设计源自 IBM(国际商用机器公司)的POWER(Performance Optimized With Enhanced RISC)。
PowerPC处理器有广泛的实现范围,包括从诸如 Power4 那样的高端服务器CPU 到嵌入式 CPU 市场(任天堂 Gamecube 使用了 PowerPC),在通信、工控、航天国防等要求高性能和高可靠性的领域得到广泛应用,是一颗“贵族的芯片”。
## PowerPC 汇编介绍
### 寄存器
PowerPC 的处理器有32个(32 位或 64 位)GPR(通用寄存器)以及诸如 PC(程序计数器,也称为 IAR/指令地址寄存器或 NIP/下一指令指针)、LR(链接寄存器)、CR(条件寄存器)等各种其它专用寄存器。有些 PowerPC CPU 还有 32 个 64 位 FPR(浮点寄存器)。
#### 通用寄存器的介绍以及用途
PPC 汇编通用寄存器范围从 r0 到 r31,各个寄存器的具体功能如下表:
| 寄存器名 | 寄存器功能 |
| ---- | ---- |
| r0 | 在函数开始(function prologs)时使用。 |
| r1 | 堆栈指针,相当于 IA32 架构中的esp寄存器,IDA pro 中把这个寄存器反汇编标识为 sp。 |
| r2 | 内容表(toc)指针,IDA pro 中把这个寄存器反汇编标识为 rtoc。系统调用时,它包含系统调用号。 |
| r3 | 作为调用函数的第一个参数和函数的返回值。 |
| r4 - r10 | 函数或系统调用开始的参数。 |
| r11 | 用在指针的调用和当作一些语言的环境指针。 |
| r12 | 它用在异常处理和 glink(动态连接器)代码。 |
| r13 | 保留作为系统线程 ID。 |
| r14 - r31 | 作为本地变量,非易失性。 |
#### 专用寄存器的介绍以及用途
除了一些通用寄存器,在 PPC 中还存在一些比较特殊的专用寄存器:
| 寄存器名 | 寄存器功能 |
| ---- | ---- |
| lr | 链接寄存器,它用来存放函数调用的返回地址。 |
| ctr | 计数寄存器,它用来当作循环计数器,会随特定转移操作而递减。 |
| xer | 定点异常寄存器,存放整数运算操作的进位以及溢出信息。 |
| msr | 机器状态寄存器,用来配置微处理器的设定。 |
| cr | 条件寄存器,它分成8个4位字段,cr0-cr7,它反映了某个算法操作的结果并且提供条件分支的机制。
### 常见汇编指令操作码
#### 赋值语句
| 指令名 | 指令作用 |
|----|----|
| li rA, imm | 将立即数的值赋值给 rA 寄存器 |
| lwz rA, d(rB) | 将 `rB+d` 地址取值存储到 rA |
| lis rA, imm | 将寄存器的值先左移 4 位,并赋值给 rA 寄存器 |
| mr rA, rB | 将 rB 寄存器的值赋值给 rA 寄存器 |
#### 存储指令
存储指令的作用使用第一个操作数的内容存储到第二个操作数的内容地址中。PPC 指令中一些常见的存储指令:
![](http://10.20.152.151/server/../Public/Uploads/2020-05-14/5ebca3ef79fc7.png)
- 如这里对 `stb rS, d(rA)` 存储指令的理解:[rA + d] = rS,即将 rS 寄存器的内容存储到 `rA + d` 表示的内存地址中。
#### 加载指令
加载指令与存储指令类似,只是将数据存储位置换了一个方向,即将第二个操作数的内容存储到第一个操作数的内容地址中。一些常见的加载指令:
![](http://10.20.152.151/server/../Public/Uploads/2020-05-14/5ebca49e90436.png)
- 如这里对 `lbz rD, d(rA)` 加载指令的理解:rD = [rA + d],即将 `rA + d` 内存地址中的值存储到 rD 寄存器中。
#### 转移/跳转指令
PPC 的跳转指令主要分为以下几种:
```
b 无条件转移
bl 函数调用
blr 函数返回,跳转到 lr 寄存器存储的地址中
bctrl jump to ctr 寄存器
```
- 特殊寄存器传送指令
![](http://10.20.152.151/server/../Public/Uploads/2020-05-14/5ebca7f698e82.png)
#### 其他指令
| 指令名 | 指令作用 |
|----|----|
| mflr rA | Move From Link Register,将 lr 寄存器的值存储到 rA 寄存器中,一般用于函数开头 |
| mtlr rA | 与 mflr 指令相反,将 rA 寄存器的值存储到 lr 寄存器中,一般用于函数结尾的返回 |
| ... | ... |
| | |
### 函数调用
powerpc 函数调用跟 arm,mips 架构指令集有些类似。函数传参从 r3 寄存器开始,r3 - r8 寄存器依次存放需要传入的参数顺序。
当调用某个函数时,用到以下指令:
```
bl func // 跳转并链接
```
该指令类似 mips 架构的 `jalr` 指令,会保存该指令下一条指令地址到 lr 寄存器中,然后 jump 到 func 函数。在 func 函数开头,会存储 lr 寄存器的值到 r0 寄存器中,接着会将 r0 寄存器的值保存到栈中。**这一系列的步骤就相当于保存调用者函数的返回地址到栈上。**
- 举个例子:
```
func:
stwu r1, -0x20(r1) // 定义 r1 栈寄存器
mflr r0 // 将 lr 寄存器的值存入 r0 寄存器
stw r28, 0x10(r1)
stw r29, 0x14(r1)
stw r0, 0x24(r1) // 将 r0 寄存器的值存储到 r1+0x24 内存地址中
......
```
然后在函数返回时,会将 r0 从栈中取出,然后赋值给 lr,然后返回:
```
lwz r0, 0x24(r1) // 将返回地址 从 r1+0x24 的内存地址中取出,并赋值给 r0 寄存器
mtlr r0 // 将 r0 寄存器的值赋值给 lr 寄存器
lwz r28, 0x10(r1)
lwz r29, 0x14(r1)
addi r1, r1, 0x20
blr // 跳转到 lr 寄存器存储的地址中,表示函数返回
```
所以在 ppc 的栈溢出利用过程中,我们需要覆盖保存 r0 的栈地址的地方。这个保存 r0 的栈地址相对 r1 的偏移是不确定的,需要自己静态分析或动态调试发现。
## IDA 汇编代码例子
以某个 Vxworks 系统的固件程序在 IDA 中的汇编结果为例,实际查看一下常见 PPC 汇编语句的作用:
```
ROM:001D3FE4
ROM:001D3FE4 # =============== S U B R O U T I N E =======================================
ROM:001D3FE4
ROM:001D3FE4
ROM:001D3FE4 loginUserVerify: # CODE XREF: FTP_User_Add+1EC↑p
ROM:001D3FE4 # add_ftp_user+164↑p ...
ROM:001D3FE4
ROM:001D3FE4 .set back_chain, -0x70
ROM:001D3FE4 .set var_68, -0x68
ROM:001D3FE4 .set var_10, -0x10
ROM:001D3FE4 .set var_C, -0xC
ROM:001D3FE4 .set var_4, -4
ROM:001D3FE4 .set sender_lr, 4
ROM:001D3FE4
ROM:001D3FE4 94 21 FF 90 stwu r1, back_chain(r1)
ROM:001D3FE8 7C 08 02 A6 mflr r0
ROM:001D3FEC 93 E1 00 6C stw r31, 0x70+var_4(r1)
ROM:001D3FF0 90 01 00 74 stw r0, 0x70+sender_lr(r1)
ROM:001D3FF4 7C 7F 1B 78 mr r31, r3
ROM:001D3FF8 7C 83 23 78 mr r3, r4
ROM:001D3FFC 38 81 00 08 addi r4, r1, 0x70+var_68
ROM:001D4000 48 00 06 91 bl sub_1D4690
ROM:001D4004 2C 83 FF FF cmpwi cr1, r3, -1
ROM:001D4008 40 86 00 0C bne cr1, loc_1D4014
ROM:001D400C 38 60 FF FF li r3, -1
ROM:001D4010 48 00 00 5C b loc_1D406C
ROM:001D4014 # ---------------------------------------------------------------------------
ROM:001D4014
ROM:001D4014 loc_1D40
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
硬件安全 硬件安全方面的基础知识以及相应攻击方法 固件安全 固件安全方面基础知识 固件漏洞类型 固件处理的技巧 相应的实例漏洞分析示例 无线电安全 无线电安全方面的基础知识以及相应攻击方法 蓝牙安全的基础知识和攻防技巧 zigbee 安全的基础知识和攻防技巧
资源推荐
资源详情
资源评论
收起资源包目录
海特实验室物联网安全知识库.zip (261个子文件)
application.adb8469c.css 75KB
application-palette.a8b3c06d.css 38KB
font-awesome.css 30KB
material-icons.css 873B
.gitignore 6B
sitemap.xml.gz 724B
index.html 96KB
index.html 63KB
index.html 62KB
index.html 56KB
index.html 56KB
index.html 56KB
index.html 54KB
index.html 51KB
index.html 51KB
index.html 49KB
index.html 49KB
index.html 47KB
index.html 45KB
index.html 45KB
index.html 43KB
index.html 43KB
index.html 43KB
index.html 42KB
index.html 42KB
index.html 42KB
index.html 41KB
index.html 41KB
index.html 41KB
index.html 41KB
index.html 40KB
index.html 40KB
index.html 40KB
index.html 39KB
index.html 39KB
index.html 39KB
index.html 39KB
index.html 39KB
index.html 39KB
index.html 39KB
index.html 39KB
index.html 39KB
index.html 39KB
index.html 38KB
index.html 38KB
index.html 38KB
404.html 37KB
index.html 37KB
index.html 37KB
index.html 36KB
wordcut.js 542KB
application.c33a9706.js 78KB
tinyseg.js 18KB
lunr.ar.js 17KB
lunr.tr.js 14KB
lunr.es.js 11KB
lunr.it.js 11KB
lunr.ro.js 11KB
lunr.fr.js 10KB
lunr.ru.js 10KB
lunr.pt.js 10KB
lunr.hu.js 9KB
lunr.fi.js 9KB
modernizr.86422ebf.js 7KB
lunr.du.js 6KB
lunr.de.js 6KB
lunr.nl.js 6KB
lunr.no.js 5KB
lunr.da.js 5KB
lunr.sv.js 4KB
lunr.stemmer.support.js 4KB
lunr.ja.js 3KB
lunr.th.js 1KB
lunr.vi.js 1KB
lunr.multi.js 817B
lunr.jp.js 36B
search_index.json 366KB
stackoverflow_exploit.md 20KB
TL_WR841n_vuln_analyse.md 18KB
readme.md 13KB
CVE-2017-0785.md 12KB
MIPS_shellcode.md 10KB
IDA_unicorn_base_tool.md 9KB
Mips_fuzzing_environment_building.md 9KB
Active_Scanning_vs_Passive_Scanning.md 8KB
found_danger_func.md 8KB
Class_of_Device.md 6KB
string_vulnerability.md 5KB
sof_tips.md 3KB
camera_dump.md 3KB
firmware_sort.md 3KB
website_download.md 2KB
readme.md 2KB
about.md 2KB
index.md 2KB
programmer_dump.md 1KB
other.md 1KB
router_dump.md 1KB
library_function_distinguish.md 963B
index.md 644B
共 261 条
- 1
- 2
- 3
资源评论
博士僧小星
- 粉丝: 1921
- 资源: 5884
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于mysql和python的学生选课系统【课程设计(实验报告+源码)】
- PxCook-像素大厨Windows版本安装包
- aspose-words-23.12-jdk16 有水印
- [大模型部署]在C# Winform中使用文心一言ERNIE-3.5 4K 聊天模型
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统设计与实现.zip
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统设计与实现+使用说明.zip
- 基于STM32单片机空气监测系统设计源码+详细文档+配套全部资料(毕业设计).zip
- rdf0412-kcu116-pcie-c-2019-1.zip(XILINX KCU116 源码)
- 基于C#语言的winform界面火车票订票系统(源码+实验报告)
- 【华为OD部分真题及讲解】华为OD部分真题及讲解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功