how2heap之House-of-Einherjar
House of Einherjar需要的漏洞off by one控制pre_size和pre_inuse
原理利用free函数的后向合并1234567/* consolidate backward */if (!prev_inuse(p)) { prevsize = prev_size(p); size += prevsize; p = chunk_at_offset(p, -((long) prevsize)); unlink(av, p, bck, fwd);}可以看到,发生后向合并时是根据pre_inuse决定是否发生合并,由presize决定上一个chunk的位置
示例代码glibc2.23123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919 ...
【WP】Null-Byte溢出
题目提示了是glibc2.27的环境由于没有远程环境,exp就是打本地的
题目描述create最多申请7个堆指针存在bss段在create同时输入数据存在Null字节溢出
deletefree指针后置0
show打印出每个指针指向区域的内容
思路利用NuLL-Byte溢出造成chunk overlap,先泄露基址,然后修改tcache的fd申请到__free_hook空间,写入system函数地址,最后执行system(‘/bin/sh’)getshell
布置好chunk第一个chunk大小为0x?8,使用下一个chunk的presize位,从而溢出覆盖下一个chunk的size位第二和三个chunk设置大些,利用第二个chunk进行overlap,需要布置fake presize绕过检查,第三个chunk用来触发unlink,所以也需要大于0x408,从而不被放入tcache,第四个用来隔开top chunk
NuLL-Byte溢出,并在chunk2中埋下两个指针free掉chunk1,free掉chunk2,再申请chunk1并输入数据即可覆盖size位(0x911->0x ...
【WP】宁波市赛Pwn
赛后复现,学习了
static_list栈溢出和之前做的虎符线下题jdt有点像,但这题需要操作一下才能溢出
题目描述init初始化栈的信息大概如下(1~63)
create1234567891011int __fastcall create(__int64 a1){ int i; // [rsp+1Ch] [rbp-4h] for ( i = 0; i <= 63 && content[i] != -1; ++i ) ; if ( i == 64 ) return puts("no free spaces!"); content[i] = allocate(a1); return puts("done!");}
123456789__int64 __fastcall allocate(unsigned int *a1){ unsigned int v2; // [rsp+14h] [rbp-4h] v2 = *a1; if ( *a1 != -1 ) *a1 = ...
How2heap学习笔记-6
草稿,未完待续large bin attack两个位于栈上的值stack_var1 (0x7fffffffdc90): 0stack_var2 (0x7fffffffdc98): 0
malloc(0x420) p1malloc(0x20)malloc(0x500) p2malloc(0x20)malloc(0x500) p3malloc(0x20)
free(p1)free(p2)unsortedbinall: 0x603460 —▸ 0x603000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x603460 / ‘`4`‘ /
malloc(0x90)unsortedbinall: 0x6030a0 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x6030a0largebins0x500: 0x603460 —▸ 0x7ffff7dd1fa8 (main_arena+1160) ◂— 0x603460 / ‘`4`‘ /
free(p3)unsortedbinall: 0x6039a0 —▸ 0x6030a0 —▸ 0 ...
How2heap学习笔记-5
house of forceglibc2.23通过修改top chunk的size位及malloc相应大小达到申请到目标地址空间的目的
示例代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100/* This PoC works also with ASLR enabled. It will overwrite a GOT entry so in order to apply exactly this technique RELRO must be disabled. If RELRO is enabled you can always try to return a chunk on the stack as proposed in Mallo ...
How2heap学习笔记-4
overlapping_chunks利用修改空闲块的size位造成堆块重叠
示例代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475/* A simple tale of overlapping chunk. This technique is taken from http://www.contextis.com/documents/120/Glibc_Adventures-The_Forgotten_Chunks.pdf*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>int main(int argc , char* argv[]){ intptr_t *p1,*p2,*p3,*p4; fp ...
【WP】津门杯2021-Easypwn
题目描述保护全开
add最多申请四个堆输入的phone num和name存在溢出,输入到bss段上,可以覆盖后面的指针申请的des的大小在0~128des的size和指针记录在bss段上
结构可以分成两部分看
freefree指向des的指针指针未置0num的第一个字节和name的第一个字节修改置0des的size位置0
show输出num输出name输出存储des处指针指向的内容
edit先判断输入的index是否在范围内然后直接向对应的num和name区域输入数据,无长度限制最后根据des的size位向des区域读入对应大小的数据(free后size位置0,无法读入)
思路创造一个unsorted bin再用show就可以泄露得到libc基址计算出malloc hook地址和one_gadget地址利用编辑功能覆盖指针首先edit(1, 'A', 'B'*13+str(p64(malloc_hook)), 'C'),把指针覆盖指向malloc hook然后再次edit,edit(1, 'A', 'B' ...
【WP】CSTC2021-Pwn
bank分析首先把输入和一个随机数用strcmp进行比较通过则进入if中,把flag文件读到栈上之后存在一个格式化字符串漏洞
思路输入'\x00',则当生成的随机数第一个字节也是'\x00'时,就能通过判断之后就是利用格式化字符串打印出flag本地建一个flag.txt文件,gdb断点打到printf接下来就要测出flag的偏移可以直接使用一串%p确定
或者看栈的信息
可以看到flag位于栈上第四个参数,而fmt字符串储存在RDI寄存器中,同时fmt字符串中%n$sn为fmt字符串后面的参数的顺序,也就是说RSI对应格式化字符串的第一个参数。而由于栈上第一个元素为返回地址,应除去,所以总的来说flag就对应第8个参数(5+3)最后输入%8$s即可输出flag
exp12345678910111213141516171819from pwn import*context(os='linux', arch='amd64')while True: r = process('./bank') r.rec ...
How2heap学习笔记-3
poison_null_byte漏洞点为单字节溢出且为NULL byte溢出常见于strcpy函数,在复制字符串时会拷贝结束符\x00通过修改size位,最后free后一个chunk,触发unlink造成堆块重叠
示例代码ubuntu16 glibc2.23123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#include <malloc.h>#inc ...
How2heap学习笔记-2
Ubuntu16.04glibc2.23
unsafe_unlinkExploiting free on a corrupted chunk to get arbitrary write
unlink分析正常的unlink目的是把一个处于双向链表中的空闲块拿出来free当前堆块,分别判断前后的chunk是否处于空闲,若处于空闲则进行合并,执行unlink
unlink的具体步骤12345678910111213141516171819202122232425262728#define unlink(P, BK, FD) { FD = P->fd; BK = P->bk; if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) //检查 malloc_printerr (check_action, "corrupted double-linked list", P); else { FD->b ...




