前言
PWN终于不是背锅了(流泪)。题目感觉有点ez,不过做出来的4道题PWN都是要概率的,这就很看脸了,全程脸黑的我每个脚本都打了二三十遍才拿到flag。
misc
ctf_game
打开压缩包,直接文本打开文件即可看到flag。
PWN
wow
思路
与2020 RCTF的bf类似,缓冲区紧接着的指令指针存在off by one,可以控制该指针在栈上任意输入。
劫持返回地址构造rop,并将指令指针还原回去(存在check)。
因为禁用了execute系统调用,所以需要通过ORW方式获取flag。
exp
1 | from pwn import * |
easybox
思路
存在off by one漏洞,利用漏洞可以实现chunk extend,得到两个指向同一地址的指针。然后利用堆错位来伪造size位等,实现将同一个地址先后free进fastbin和unsortbin,进而利用main_arean劫持stdout结构(1/16概率),使用io_leak的方法获取到libc地址。
接着用fastbin的double free漏洞劫持__malloc_hook,从而getshell。
exp
1 | from pwn import * |
maj
思路
存在大量混淆,可以直接忽略。
free时未清空堆指针,从而可以利用堆错位来伪造size位等,实现将同一个地址先后free进fastbin和unsortbin,进而利用main_arean劫持stdout结构(1/16概率),使用io_leak的方法获取到libc地址。
并且因为没有开启pie,因而可以劫持堆指针。
构造一个堆指针指向__free_hook
,将其改为system,从而实现getshell。
exp
1 | from pwn import * |
nofree
strdup存在00截断,因而可以溢出堆块。通过构造使top chunk进入0x70的fastbin中,从而控制堆指针,达到任意写。
这里采用爆破第4位(概率为1/16)的方式将read改为onegadget,从而getshell。
exp
1 | from pwn import * |
babyjsc
这道题纠结了好久,一直不会,比赛后找大佬问了才知道是python2的input()存在问题,可以直接逃逸。输入__import__('os').system('/bin/sh')
即可getshell了。