zctf_2016_note3

文章介绍了如何利用程序中的前向合并unlink机制进行堆溢出攻击。通过创建0size的note,导致无限字节读入,进而修改chunk结构,伪造chunk以实现unlink。过程中涉及Glibc的内存管理机制,包括freechunk的size修改和pre_size字段的处理。最终通过一系列步骤,包括修改got表,泄露libc基址和执行onegadget,达到控制程序的目的。

前言

记录unlink技巧的前向合并。虽然本题是可以做到无限长度的写入内容,降低了前向合并攻击的难度。本文只是基于作者目前的知识,有不对的地方或者好的思路,欢迎各位师傅进行交流。

题目分析

按照惯例就是查保护,没有完全开启relro保护,估计是可以用hijcak got的。
在这里插入图片描述
ida静态分析一下,很常规的note管理,增删改。

  • 添加note
    在这里插入图片描述
    重点关注一下,在0x4008dd处的读取输入函数,因为a2是unsigned int类型的数据,也是我们传入的note的size,如果我们创建的是0byte大小的note,那么a2 - 1就是四字节能够表示的最大数,也就可以实现无限字节读入了。
    在这里插入图片描述
  • 修改note
    在这里插入图片描述
  • 删除note
    在这里插入图片描述

思路&exp

前向unlink源码

  • 对于前向合并,基本上没有什么检查,但是nextchunk是通过当前被free chunk的size找到的头部,所以需要修改当前被free chunk的size才能够让伪造的chunk 被unlink掉。
    nextchunk = chunk_at_offset(p, size);
    nextsize = chunksize(nextchunk);
    /* consolidate forward */ //前向合并
    if (!nextinuse) {
    unlink(av, nextchunk, bck, fwd);
    size += nextsize;
    }
  • 在glibc-2.27以后,unlink 前向的时候还需要注意伪造pre_size字段。
    #define unlink(AV, P, BK, FD) {
    if (__builtin_expect (chunksize§ != prev_size (next_chunk§), 0))
    malloc_printerr (“corrupted size vs. prev_size”);

exp

可以通过创建0 size大小的note,来实现堆溢出写,从而修改后面chunk的结构。从而创建fake chunk,实现unlink attack。此处使用的是前向的unlink攻击。下面先贴出exp。

from pwncy import *
context(arch = "amd64",log_level = "debug")
p,elf,libc = load("zctf_2016_note3",remote_libc = "/home/tw0/Desktop/tool/buu_libc/x64/libc-2.23.so",ip_port = "node4.buuoj.cn:29605")

def cmd(choice):
	sla("option--->>\n",str(choice))
def create_note(size,content):
	cmd(1)
	sla("Input the length of the note content:(less than 1024)\n",str
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值