非堆题
mrctf2020_shellcode
ret2shellcode。 但是附件看不了反汇编,要求直接读汇编代码
栈溢出不行 直接发shellcode(好无聊的题)bjdctf_2020_babyrop2
main中有gift和vuln函数 gift函数可输入6个字节 gdb开调,canary再rbp-0x8处,栈上则使第七个参数(8字节算),填充完buf到canary 泄露出来刚好第六个位置为aa 覆盖完ret2libc
exp
|
|
inndy_rop——ropchain的利用与静态编译
静态编译
如图,程序在IDA打开后,左侧函数栏并没有红色部分(也就是系统调用函数!) 所以一般这种静态编译的文件大小也会比一般pwn题大,既然没有调用库函数的话,那我们也没办法拿来ret2libc,用ropchain来构造rop链
call system('/bin/sh')
exp
|
|
事实上由于题目的输入限制都是有限的,所以ropchain无法使用,不过如果我们对ropchian简单的修改缩减或许就会有很大的帮助
cmcc_simplerop
也是一道静态编译题,但是空间不够大。需要简化ropchain或者直接系统调用,当然你迁移过去再搞ropchain也没问题(
exp
|
|
pwnable_orw
保护
沙箱(secure computing),orw可用长这样,先prctl禁止提权(prctl宏定义可在prctl.h中看),然后限制orw,手写orw或用shellcraft的集成功能
堆题部分
babyheap_0ctf_2017 ♥
保护全开 菜单题 新增堆块,可以自定义大小,不超过4096,申请成功将该区域置标记为1,v3根据v2大小获得一个指针,指向分配的堆空间 fill部分,用户根据需要提供修改的堆块的index和修改的size——但是size可以任意构造 free就是free,将使用位置标记改为0并申请空间释放,指针也指为0 dump函数会根据堆块index索引显示堆块内容,可以考虑泄露堆空间上内容
解题
patchelf
由于本地glibc版本过高,所以我们在做题之前要同步一下环境,不然fastbins会根据新glibc改为tcachebins
|
|
思路
- unsortedbin在一个chunk被free后归入其中时,其表头会指向这个被free的chunk,chunk的fd指向之前被free的chunk,如果没有就会指回表头,
- 而我们这题我们要用到
__malloc_hook
,这东西在我们调用malloc创建新的堆块的时候便会调用 - 如果我们能够操控这个hook,通过call调用它的地址的时候,如果其中是system地址,就可以getshell
这题的环境是ubuntu16,
__malloc_hook
的函数地址偏移是固定的,我们通过main_arena、unsortedbin计算偏移最后就能得到,main_arena的确定得用到fastbin attack
,
简单来说,free chunk
通过单链表进行维护,如果在free后没有将指针置零的话,那么arena的bin头的fd指针会指向申请的chunk上的fd,如果我们可以操控这个指针指向的地址,那么chunk的fd指针就会指向目标地址!只要我们再次申请这个chunk块,bin头指针自然就指向这个目标地址了!
|
|
这样构造堆结构以后,
呈现为fastbin->chunk1
的结构
|
|
覆写chunk0 0x8覆写chunk1 prev_size
allocate(0x80+0x10+0x80)
申请堆块,并且刚好到chunk2
然后我们改写chunk2的size,使得一部分可以进入到unsorted bin中(虽然这样会导致一部分溢出到chunk3中,但是问题不大) 然后free(2)就可以获得指向main_arena的指针信息,通过dump(1)打印
之后打fastbin attack,通过改写malloc_hook指针指向one_gadget即可
exp
点击展开
|
|
[ZJCTF 2019]EasyHeap
保护 菜单题 create heap
- heaparray[i]存放chunk地址
- read_input(heaparray+i,size)写入chunk大小
- 跳转查看后heap_array在bss段上
edit_heap()
读v0大小到指定chunk中,但是v0比create大就溢出了
delete中free时会将指针置0,所以不存在UFA, 后门 ,或许修改掉magic就可执行 PIE没开,heaparray_addr = 0x6020E0
详解
先申请到3个chunk
|
|
heap2我们要将它送进fastbins,并修改指针到heaparray_addr
的地址,下次申请时先申请到heap2,再到存放堆数组指针的地方申请作为伪装堆
|
|
接下来我们要把heaparray[0]修改为free_got,利用unlink将free_got修改到system去,then——free(1),由于free_got修改到system,直接执行
system('/bin/sh')
!
exp
点击展开
|
|
hitcontraining_uaf
uaf,main:
free后没有清除指针,可以uaf 添加chunk,最多5个,notelist[i]
是malloc分配的堆,第一个chunk默认分配(每次都有一个),用来存放puts函数(print用的),之后的可以控制,而且有magic提供后门函数,notelist[i][1]
是利用malloc分配的我们的堆,之后可以读入欸但是由于free只是把内容放空,所以我们即使free掉了前面的chunk,i继续增加,指针仍指向原来的chunk 大概是这样,分配两个fastbin大小堆块,free后malloc一个8Bytes的chunk,它会直接写入到chunk0的puts中,由于chunk2的sub_chunk指了回去,最后修改到chunk0的指针到magic
我们再次申请的时候由于sub_chunk的原因, 申请完大小以后传入magic地址,fd=0x867f000这里会修改为print note的地址,我们之后打印堆块就会自动触发magic
exp
|
|