强网先锋
babymessage
思路
message处存在溢出,可以修改esp,通过栈迁移到name,从而控制size,进而可以进行较大空间的rop,接着leak出libc地址和用onegadget进行getshell即可。
exp
1 | from pwn import * |
Siri
思路
Remind me to
指令处存在格式化字符串漏洞,可以leak出栈和libc地址,接着修改__free_hook
为onegadget,并利用printf输出长串字符时需要free原有缓存区并重新申请的功能,调用free,进而getshell。
exp
1 | from pwn import * |
babynotes
思路
堆块申请后没有进行初始化,从而可以leak出libc和堆地址。
free时,index为有符号整数类型,并且没有要求其大于0,所以可以对存放name处的堆块进行double free,并以此申请到存放堆指针处,进而达到任意写。将__free_hook
修改为system函数地址,从而getshell。
exp
1 | from pwn import * |
PWN
easypwn
思路
存在off by null漏洞,利用chunk extended,并错位申请到控制同一个堆块的size。并通过伪造size将堆块先后放进fastbin和unsortbin,爆破低4位劫持stdout结构(概率1/16),从而leak出libc地址。并通过UAF修改fastbin的fd,申请到__malloc_hook
附近,修改其为onegadget,从而getshell。
exp
1 | from pwn import * |
oldschool
思路
菜单题,没有对申请到的数据进行初始化,从而可以leak出libc以及堆地址。
对mmap申请出来的地址进行edit时,对偏移等条件判断错误,误用了&&,从而可以任意地址写。将__free_hook
修改为system地址,并free一个/bin/sh
的堆块即可getshell。
exp
1 | from pwn import * |
direct
思路
2.27环境下的题目。edit时偏移采用有符号整数类型,从而可以输入负数造成溢出,利用该漏洞进行chunk extended,进而获取到两个同一地址的指针,达到任意地址申请的目的。
readdir时第一次会将目录下全部文件名保存在缓冲区中,通过构造,可以通过修改申请到的堆块size位,将该缓冲区释放,接着再申请到某一文件名后,将该堆块free进unsortbin,从而leak出libc地址。结合上面的任意地址申请,修改__free_hook
为system函数地址,进而getshell。
exp
1 | from pwn import * |