当前位置首页 > Debian知识

qemu的方式安装debian模拟powerpc

阅读次数:207 次  来源:admin  发布时间:
http://bbs.pediy.com/showthread.php?p=1424746

http://www.ibm.com/developerworks/cn/linux/l-qemu/

线总结下搜集来的资料吧: http://www.xfocus.net/articles/200406/711.html 文章很老,但是依旧价值不菲!感谢前辈留下如此NB的文章。 指令集部分百度就可以了! powerpc的东西很难找到相对应的环境,如果想做只能通过qemu 的方式安装debian 当然也有分享好的img https://people.debian.org/~aurel32/qemu/powerpc/ 上面可以下载已经安装好的虚拟机 可以通过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的位置。 很奇妙的想法。

上一篇:debian终端tab键无法补全命令,systemctlstatusfire无法补全
下一篇:CentOS7安装