安天杯HITCTF2019记录

人在寝室,刚下火车(逃

承蒙大佬关照,跑去参加了于哈工大进行的安天杯HITCTF2019。这也是我第一次参加CTF线下赛,所以其实还是有点慌的。完全没听说过的猎杀模式,还有只是听说过但是从来没打过的AWD,以及事前就听说这个比赛一直很注重二进制,有一说一,慌得一批。参赛的有RE神仙@双草酸酯、PWN神仙@leet2own,还有什么都看过一点,但是原先搞过RE的我。反正就很二进制(。前一天就签了个到,这里吐槽下扑克还是去年的,虽然去年这时候我还在玩泥巴就是了XD

DAY1:解题+猎杀

解题上来就是5re、2misc,大概pwn和web都放在第二天的AWD了。题给分其实有点怪,misc只有两题于是一题500一题300还算合理,但是RE4题410,剩下1题VM就500,非常夸张。上来misc下不下来,所以跑去看re,找了一题Concel。这个题目其实真的挺简单的,逻辑非常清晰,就是简单的读取输入,然后一位一位的比较。唯一的障碍就是分支相当多,case多达四五百个,于是就复制出来写了个脚本一拼,就做完了。此时双草大佬已经连续拿了两道题了,leet2own大佬拿的题也快做完了(好像是抄错了233)。

于是我和双草大佬开始看VM。其实VM代码不多,主要是分析其VM结构,所以作为一个机组期末复习人,我开始肝结构和指令集。其实这个VM的构造还是很规范的,基本就是正常的计算机结构。很容易看出几个数据寄存器和pc、acc寄存器。之后就可以开始还原指令集了,指令集除了几个特殊的读写,其他的和一般的asm大致相同,逻辑算术运算、跳转、nop等等基本一个不差。另外指令是变长的,可能的长度为2或4。顺便把读、写、程序的偏移也找了出来。然后py简单写了个disassembler,开始分析程序。程序内容大概是把输入每位-36,异或位置,之后反向与数据比较。我这刚看到反向双草大佬就光速整出了flag,tql。

之后看Misc,之前已经看过Loop,dump出若干文件识别出有效文件(第一个)是个mht,然而进一步dump就没思路了,因此跑去看了Careful。Careful是个docx文档,直接解压没看出什么,binwalk发现有png、vmdk、exe、Windows Script Encoded文件。前俩png大概是文档中的图片,所以我就dump了后三个文件,结果发现vmdk挂载后什么都没有,exe丢进010根本连模板都跑不过。所以当时我猜最后一个文件是binwalk抽风了,所以和exe一起dump,发现格式就对了。之后又回头把两张图片dump出来,发现第二张图片只有最上面一小段。加上docx的提示,猜测这些文件是嵌套关系,即png->vmdk->exe->wse(现编名字),四舍五入就是wse呗。于是直接找了个解码器,scrdec18-VC8.exe 9DEDC.bin out -cp 936,然后flag就安排上了。禁止套娃嗷!

最后就差Loop了,这题我疯狂演队友。看到mht,我就想到了是IE保存网页的一个选项,于是就奔着IE去了。经过若干次猜测之后,双草大佬找到了安天对这个洞的分析报告,其实这个是对CVE-2012-0158的利用。按着报告,dump出shellcode,然而shellcode以各种姿势都运行失败。这时双草大佬就去肝猎杀题了,我搞了半天,shellcode执行就是会段错误,disassembler也给不出靠谱的结果,于是帮着看猎杀题的网络流量。因为是针对qq的马,所以我着重看了OICQ协议,另外还看了HTTP流量,并没有看出什么东西(只是在看HIT校园网而已)。双草大佬分析完了之后,提出了用猎杀的虚拟机(XP)直接跑mht的想法,其中他还下了个office2003,然而大佬问word能不能打开的时候我坚定的回复是IE的文件,于是他就取消下载了,于是我们与正确解法远远的跑开了……赛后跑去问了解出来的哈工lilac的大佬,结果发现真是word打开的,之后会运行一个update.exe,逆向即可得到flag。以及shellcode没法运行是因为调用了word相关方法,没它的栈当然没法跑(

解题模式最后差了Loop,和哈工威海的dalao们并列第二。但是由于我们Careful慢他们VM一点,所以顺位第三。然而晚上出猎杀成绩的时候很惊喜,只有我们和哈工本部两队做了,因此我们DAY1第二,与上下都差400分。真就一天的二进制呗。

DAY2:AWD

只有一题web和一题pwn,因为没什么经验所以就跟着大佬们的安排走,改个密码就开始审计。和预想不同,这次的web是flask,我对flask知之甚少,于是只能硬着头皮看,双草大佬开始加log。总共5个洞,前俩比较好找,第三个算是眼瞎,看到别组payload才意识到。还有俩一个是pickle的反序列化,另一个是ssti。赛况是长理眼疾手快,很早就开始打了,之后是我们和lilac不相上下。然后是一些patch了一二的队伍,剩下队伍就没怎么操作了。开始log抓炸了,所以没有post body的payload,错过了lilac的pickle反序列化。然而大部分洞其实都给双草大佬提前修了,而且pickle大佬也指出来了,只不过我俩都不是很会。重放+提前修改太强了。另外,其实本来我们是比lilac高的,然后lilac用pickle那个洞追了上来。在最后一轮之前我们其实略微高lilac一点点,然后他们在最后一轮用ssti反超了。其实我当时正好在最后一轮审计,也看到了那个洞(先render了之后又render_str了一次),但还没产生想法人就没了。其实payload类似我很早之前写的一个沙箱脱出的一部分。

pwn那边,题巨难,全场没人做出来。开始甚至还要走个迷宫。于是我要了一份输出,写一个dfs跑。然后我就疯狂演了我自己,python那边,我初始化是[[False] * size] * size,半天没看出来,懵逼了很久。转到cpp,行列搞反了,演员石锤了。

第一次的awd,感觉好强。而且5分钟一轮真的挺赶的。不过学到了很多骚操作,太棒了.jpg。

后记

第一次线下赛,着实感受到了自己的菜。平心而论,其实re题出的都比较简单,而且也缺少其他类型的题目。感觉自己还是欠缺了挺多常识的,还需要进一步的努力。不过最后拿到了第二还是挺开心的。最后贴张有点东西的扑克

分享到

KAAAsS

喜欢二次元的程序员,喜欢发发教程,或者偶尔开坑。(←然而并不打算填)

相关日志

  1. 没有图片
  2. 没有图片
  3. 没有图片
  4. 没有图片

    2016.02.14

    日本人名研究
  5. 没有图片

    2022.02.01

    向着2022年奔去
  6. 没有图片

评论

  1. repostone 2019.11.26 4:48下午

    博主又更新了。

  2. 小蛋蛋 2019.11.28 3:25下午

    当时xp镜像我想装上office 2003的考虑到 loop题 就没装

    • KAAAsS 2019.11.28 5:06下午

      看来这还真是个挺自然的想法(

在此评论中不能使用 HTML 标签。