[WDB-offline-2018] 网鼎杯-2018线下记录

说明

此writeup包含两天的pwn题,exp和二进制文件见附录

正文

这次线下并没有以CNSS来打,而是以DURA(Dianzikeji University Retired Ailliance)来打的。然而因为操作失误,把CNSS挤出了半决赛。。。。

不得不吐槽这次线下,比当时强网杯操蛋多了,怎么打个ctf还要断网的呢???怎么这check这么不靠谱的。

Day1

Day1开场测试交题时发现zz icq给的接口居然有2s的cd,mmp,最后还是通过直接从平台抓包拿的接口交题的,不然永远在retry。被逼无奈只能把3个pwn和一个web的exp全部写在同一个py里面,统一交题,可以说是非常的蛋疼了。事实上解决这种问题的最好方法应该是写一个中心服务器,拿到flag就post给中心服务器,最后由中心服务器统一提交flag。

Day1可以说是打的心累,据说还有pwnable.tw的原题,然而我并没有做到,我好菜啊,差点被挤出决赛圈。同时午饭又冷又难吃,可以说是伙食最差的一场线下了。

Day2

苟进决赛圈后,据说第二天是AWD+CTF,第一次见到3小时这么养生的线下。公告上说第二天有sm3,sm4的加密,并没有复盘day1的题,结果第二天一看,4个题,3pwn 1web,同时1pwn 1web是原题,jbdxbl。不知道为啥,第一天的脚本死都打不通,到比赛结束前半小时才发现由于主办方换了启服务的方式,将socat换成了xinetd,leak时本来用的recv(8)是没问题的,到了第二天就炸了,原因是recv不保证接收到8个字符,改成recvuntil或者想办法保证收到8个字符就没事了。。。。感觉亏了1k分….

除此之外,Day2的ctf全都是crypto,可以快乐摸鱼了,然而一个题都没做出来。事后问SJTU的师傅才知道是凯撒,我好菜啊orz。

感谢老大的帮助,最后终于苟进前15,终于有路费了orz

1.png

后记

说实话,这场线下题目质量不是很行。又有原题,其它题题目难度也不高,同时堆题一点检查都没有,把free给nop掉后居然还能过check,和强网杯的check强度根本没法比。

除了题目不太行以外,这一场线下有一堆诡异的事情,我明明pwn题都修好了,怎么还能被打进来的????打进来就算了,怎么隔几轮打一次一点规律都没有的。。。事后了解到一些师傅都把pwn删了还能被拿走flag,怕不是打的ssh 0day哦。不得不说你们icq是真的厉害,是真的毒瘤。想到了最后几轮那几个服务全红还能一轮加400分,上分速度比eee还高,突然明白了什么。。。。。不愧是**任务,rbq,rbq。关于此事知乎上也有很多讨论,也不想吐槽了。。。

不过这次还是踩了几个坑,一个是题目的libc是2.17,还是RedHat的,本机不知道啥原因根本无法调试,堆题只能凭感觉打,还好比较简单,还是做出来了。这时才意识到需要魔改一下pwndbg让heap那几个命令能脱离符号表工作,不然下次碰上没符号表的libc只能等死了…..

同时这场并没有提供流量包,通防之前说要造然而到现在都没有造出来,感觉这记录流量+通防这坑需要填一下了….

说到底还是自己太菜了,看看隔壁长亭的exp师傅一个人打4个orz,太吓人了。。。

Writeup

pwn题的后缀为ip

Day1

pwn22

由于在删除friend时并没有将userList中的指针置空从而导致了UAF

day1-pwn22-1

可以把自己当成朋友add后再delete自己,通过查看自己信息来leak出libc的基址

随后再注册一个账户,设置名字长度为0x128来获得之前free的chunk,可以把name设置为got表。

由于已经leak了,got表的值是已知的,登录第一个账户后修改用户信息即可修改got表为system,从而getshell

由于check很水,patch只要在plt让free直接ret即可。

pwn24

这题可以对pointer进行加减操作,并且还能打印rbq[pointer]的值和修改rbq[pointer]的值

day1-pwn24-1

由于可以++ –当pointer为负数时会导致它指向got表,从而leak数据+修改got表getshell

patch只需要在read前加个检查即可

pwn25

pwn25有两个洞,一个是delete mark时会导致double free,另一个则是edit_mark时存在堆溢出..

由于堆上有函数指针,并不考虑去走double free,因为太好修复了,打的堆溢出的洞,并没有使用到free。

day1-pwn25-1

结构体如图

首先可以先通过写满0x40 byte,由于没有\x00截断,可以leak出函数指针,既程序基址

有了程序基址就可以通过覆盖markInfo来进行任意leak和任意地址写

Day2

pwn23为第一天的pwn24

pwn24

没有技术含量的栈溢出,直接覆盖返回地址为system即可

pwn25

还是栈溢出

day2-pwn25-1

可以先覆盖fd为0,从而读入的内容可以控制,随后栈溢出即可

附录

题目以及exp:wdb-2018-offline.zip