nisc2019
前言
昨天跟队里打(学习)的一场比赛,团队零贡献,又是看七哥姚老板日天的一天。。
one_string
漏洞利用
程序是静态编译的,Edit里会用Strlen修改对应的size,下次Edit根据这个size编辑,因此可以分配0x28之类的chunk,strlen的时候连上size即可覆写后面的size,可以unlink,可以fastbin attack,最终修改0x0804ea4d8的malloc_hook为shell_code_addr(在bss里)我这里用的Unlink,本地通了就没调了
exp.py
1 | #coding=utf-8 |
two_string
程序逻辑&漏洞利用
可以Create Display Delete,其中Delete之后没有清空chunk内容,可以malloc(0)避免写入,从而泄露堆地址和libc地址。
Merge strings里的total_size是4字节的,而计算它的时候没有对其进行检查,从而可以构造0x100000068之类的total_size来分配0x68的chunk,大部分时间都花在找size了。。,最终的total_size由x*8+y+z构成,x是一个较大的数,y为0x100,z为我们要分配的chunk大小,最终z为0x400,使得可以覆写chunk后面那个0x10的块的size,造成overlap chunk,最终Fastbin attack可以修改malloc_hook
1 | unsigned __int64 Merges() |
exp.py
1 | #coding=utf-8 |
收获
第二道题的那个4字节的地方我看到了,结果没反应过来就过去了,最终洞都没找到,很僵硬- -,找洞真的好难。
比赛用的是libc 2.24,找这个花了很久,看另一个师傅的wp学到了pwntools给的方法1
libcdb.search_by_md5('cfcef452ef69ea2dd73d6f55d7607c2b')
realloc这个好像不太一样,最后那部分构造chunk花了好久,得找个时间总结一下。