首页
社区
课程
招聘
[原创]整理下最近关于powerpc的指令集东西
发表于: 2016-4-12 17:44 8285

[原创]整理下最近关于powerpc的指令集东西

2016-4-12 17:44
8285

首先感谢前辈们做出的贡献。
线总结下搜集来的资料吧:
842K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4S2X3L8$3y4#2M7#2)9J5k6h3&6W2N6q4)9J5c8X3q4J5N6r3W2U0L8r3g2K6i4K6u0r3x3U0l9H3y4o6l9$3i4K6u0r3y4K6p5I4i4K6u0W2K9s2c8E0L8q4)9J5y4X3&6T1M7%4m8Q4x3@1u0Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4@1f1$3i4K6V1$3i4K6R3%4i4@1f1%4i4@1q4n7i4@1p5H3i4@1f1#2i4@1u0q4i4K6R3^5i4@1f1^5i4K6R3H3i4K6R3I4i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1@1i4@1u0p5i4K6R3$3i4@1f1$3i4K6V1^5i4@1q4r3i4@1f1@1i4@1u0q4i4K6W2p5i4@1f1$3i4K6V1%4i4@1p5%4i4@1f1@1i4@1u0n7i4@1t1%4i4@1f1#2i4K6R3H3i4@1u0o6i4@1f1@1i4@1t1^5i4K6S2p5i4@1f1^5i4K6S2r3i4@1t1J5i4@1g2r3i4@1u0o6i4K6R3I4i4@1f1$3i4K6R3@1i4K6W2r3i4@1f1^5i4@1t1H3i4@1p5J5i4@1f1#2i4K6R3&6i4K6S2p5i4@1f1^5i4@1u0q4i4K6R3^5i4@1f1%4i4K6V1#2i4K6V1&6i4@1f1@1i4@1t1^5i4K6S2n7i4@1f1#2i4@1p5$3i4K6R3J5i4@1f1$3i4@1q4p5i4@1p5@1e0V1u0Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0k6Q4z5e0k6Q4z5o6N6Q4c8e0N6Q4b7f1u0Q4b7e0m8Q4c8e0y4Q4z5o6m8Q4z5o6t1`.
指令集部分百度就可以了!
powerpc的东西很难找到相对应的环境,如果想做只能通过qemu 的方式安装debian
当然也有分享好的img
9b6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3k6h3!0H3L8r3g2Q4x3X3g2V1k6h3u0A6j5h3&6Q4x3X3g2G2M7X3N6Q4x3V1k6Q4y4@1g2S2N6i4u0W2L8o6x3J5i4K6u0r3M7h3g2E0N6g2)9J5c8Y4m8G2N6$3g2J5M7r3y4Q4x3V1j5`.
上面可以下载已经安装好的虚拟机 可以通过qemu直接执行
只是里面工具不全需要下载相应的应用
apt-get install vim
apt-get install gcc
atp-get install gdb
...
当然包括其他你想要的的工具
这里提供个小的框架
char shellcode[] = {}

int main(int argc, char **argv)

{

int (*f)();

f = (int (*)())&shellcode;

(int)(*f)();

}
想要分析的shellcode 当做字符串放在 shellcode数组里。

如果只是静态分析 gcc不用加其他参数 如果是动态调试 就需要在编译的时候加上gcc -g -fno-stack-protector  参数来去除栈保护。

然后基于ida 导入  跳入shellcode  IDA 按c 强制转换成指令代码,如果准备工作没问题而且你导入的的确是shellcode,那么东西就出来了。

------------------------------------------以上是准备工作--------------------------------------------------------
首先我们来熟悉powerpc的指令集:
PowerPC体系结构是RISC(精简指令集计算),定义了 200 多条指令。PowerPC 之所以是 RISC,原因在于大部分指令在一个单一的周期内执行,而且是定长的32位指令,通常只执行一个单一的操作(比如将内存加载到寄存器,或者将寄存器数据存储到内存)。差不多有12种指令格式,表现为5类主要的指令:

1、分支(branch)指令
2、定点(fixed-point)指令
3、浮点(floating-point)指令
4、装载和存储指令
5、处理器控制指令

PowerPC的应用级寄存器分为三类:通用寄存器(general-purpose register,GPR)、浮点寄存器(floating-point register [FPR] 和浮点状态与控制寄存器 [Floating-Point Status and Control Register,FPSCR])和专用寄存器(special-purpose register,SPR)。gdb里的info registers能看到38个寄存器,下面主要介绍这几个常用的寄存器:

通用寄存器的用途:

r0      在函数开始(function prologs)时使用。
r1      堆栈指针,相当于ia32架构中的esp寄存器,idapro把这个寄存器反汇编标识为sp。
r2      内容表(toc)指针,idapro把这个寄存器反汇编标识为rtoc。系统调用时,它包含系统调用号。
r3      作为第一个参数和返回值。
r4-r10  函数或系统调用开始的参数。
r11     用在指针的调用和当作一些语言的环境指针。
r12     它用在异常处理和glink(动态连接器)代码。
r13     保留作为系统线程ID。
r14-r31 作为本地变量,非易失性。

专用寄存器的用途:

lr      链接寄存器,它用来存放函数调用结束处的返回地址。
ctr     计数寄存器,它用来当作循环计数器,会随特定转移操作而递减。
xer     定点异常寄存器,存放整数运算操作的进位以及溢出信息。
msr     机器状态寄存器,用来配置微处理器的设定。
cr      条件寄存器,它分成8个4位字段,cr0-cr7,它反映了某个算法操作的结果并且提供条件分支的机制。
(来自san的
AIX PowerPC体系结构及其溢出技术学习笔记

powerpc的指令是四字节一组代表一条功能指令
忘记提醒一点 导入IDA的时候 指令集一定选择powerpc
这里面有几个重点的指令
mf*r mt*r  
这两个是分别是将lr(其他的基础期ctr等)保存到相应的基础 ,而且这里我有个技巧来分辨 就是已lr位对象 f代表from  t 代表to
mflr    r0 就可以理解为 from lr to r0
而mtlr r0可以理解为 to lr from r0
可能选择这东西技巧避免混淆,开始时候确实容易出问题

lis     %r4, 0 # 0x1DC0
addi    %r4, %r4, 0x1DC0 # 0x1DC0
以上两条指令是对一个基础器高地位分别赋值 这点IDA还不错 可以直接在第二条指令的基础上标出该寄存器当前的值,所以不需要特别的记忆。
另外两条常用指令是
stw,lwz
比如 stw     %r5, 0x20(%sp)
是将r5 存入sp+0x20所指向的地址。
lwz与stw相对应lwz     %r5, 0x20(%sp) 是将sp+0x20指向的地址 存入r5.
bl是跳转指令
这里面shellcode 为了寻找当前的地址会有个巧妙的方法
bl      shellcode_start
shellcode_start:
mflr    %r3
这里当bl shellcode_start时候会将下一条地址赋给lr
也就是说这时候lr指向的mflr %r3这条指令的地址
通过执行mflr %r3以后相当于r3指向了当前的栈或者堆地址,我们也就精确的找到了shellcode的位置。
很奇妙的想法。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (2)
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢楼主分享
2016-4-12 21:55
0
雪    币: 197
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢分享!
2021-5-8 14:23
0
游客
登录 | 注册 方可回帖
返回