说实话最后一个小时还放题属实闪到了我的老腰了,不过为了ak还是去试了,17:59:19惊险交题,成了比赛时间内唯一一个ak了pwn的hhh
fruitpie
这个的话,程序其实很简单
首先申请一个较大的chunk,这样得到的chunk地址就会落在libc附近,借此计算出malloc_hook到堆地址的偏移
然后就是一个任意写0x10字节,下面还会再调用一次malloc,那么将one_gadget写到malloc_hook,配合上realloc即可实现夺权
最后这里close(1)了,重定向一下
exp:
1 | from pwn import * |
ParentSimulator
开了沙箱,同时还要root才能运行,说实话太影响我调试了,直接把这里的jz改成jnz:
方法很简单,这里的74改成75就行:
漏洞也很明显:
libc-2.31下的uaf,这里free了之后不能show,不能edit_name,不能edit_description,但是可以继续free,并且有一次change_gender的机会,可以借此修改tcache的key值来double free一次
这样一来就有了两个指向同一地址的指针,借此来完成libc的泄露跟任意写
这里开了沙箱,所以我这里是找到一个可用的gadget写到free_hook,在对上提前布置好orw链,然后实现栈迁移到堆上
这里用到的gadget如下:
rdi可控,[rdi+0x48]可控,实现rbp可控,同时rax可控,在[rax+0x28]处放上leave_retn即可实现栈迁移(从其他大佬那里学来的技巧hhh)
exp:
1 | from pwnimport * |
clown
libc-2.32下的uaf
由于没有edit功能,难以利用tcache完成攻击
这里我就利用了fastbin的double free来实现任意写
后来想想其实合并unsorted bin然后切割造成堆块重叠也是可以的,我好像把问题复杂化了。。
这里还需要注意的就是libc-2.32下的fastbin和tcache都有着PROTECT_PTR的机制,具体可以自行翻阅源码:
具体就是会将free的chunk的地址右移12位后与tcache->entries作异或之后写入fd,前几天的VNCTF就遇到了
这题也开了沙箱,这题我用的是setcontext,由于2.32下setcontext的参数从rdx变成了rdi,我们这里需要利用一个gadget,通过rdi控制rdx:
exp:
1 | from pwn import * |
babybabybabyheap
最后一个小时才放出来的题,首先恢复下符号名
上来也直接白给了puts的地址
漏洞就是有一次off-by-null的机会:
话说这题一眼看去,got表可改,没开pie,off-by-null,一想就是unlink然后对got表任意读写,但是,由于edit只有一次机会,所以unlink之后就没机会对got表操作了
但是,可以通过unlink将一个正在使用的chunk错误地合并进unsorted bin,然后通过切割unsorted bin,造成堆块重叠,从而控制tcache指针
exp:
1 | from pwn import * |