2018 Cyber Industrial Control CTF Pwn



本次比赛只做出来两道Pwn HMI流水灯运行与实时数据监测。剩下两道Pwn在师傅指点下,赛后进行了复现

前面的两个Pwn是相对比较常规的

实时数据监测

实时数据监测是一道盲Pwn,利用格式化字符串的Blind Pwn。
首先,确定存在format string,随后我直接开始从0x8048000~0x8049000 dump 服务端的程序
由于程序每次需要等待20s左右才能触发一次format string 泄露一次地址,所以dump的格外慢,大约持续了4个小时….

只有将Binary 拖入IDA,然而由于部分dump有误,无法解析成ELF,只能成binary….
将支离破碎的binary汇编源码理顺,得到以下的汇编:

可见,判定条件[ds:804B14Ch]==0x2223322时顺利打印flag,最后Script:

然而,很多很快做出来的队伍都是看图得到的结论:
催化剂理想浓度0x2223322,地址0x804b14c,催化失败应该调整为理想浓度,摧化成成果,于是格式化字符串修改之,从而顺利拿到flag….

HMI流水灯运行

32bit程序,开启NX,题目中存在简单的栈溢出

但是在这个过程中通过signal设置了alarm(2)后程序进入死循环

可能Rop时间不够,所以Rop时先设置alarm,从而打断之前alarm(2)的设置,再ROP
题目的libc可通过libcdatabase查询到

-400

文件管理器

本以为应该是比较棘手的题目

可是题目提供了对任意文件读写的能力,而且没有做沙箱的限制,我们能够通过目录操作读写任意文件

tip在于procfsProc File System
我们可以通过读/proc/self/maps来泄露程序基地址,Bypass PIE
之后通过写/proc/self/mem来注入shellcode,通过程序流程执行shellcode,拿到Shell

黑客游戏

题目是一个游戏,描述的Hero与Master战斗的游戏
通过名称容易发现有一个简单的栈溢出漏洞

我们的目的在于打败level0-level4的master,从而进入函数中做ROP

打败怪兽无非就是自己攻击力高,或者回复血量快
首先同一个等级下hero的血量上限低于master

并且在attack过程中,约定hero与master都有一个attack和defense
如果\(hero_attack>master_defense,master-=hero_attack-master_defense\)
否则\(master_attack>hero_defense,hero-=master_attack-hero_defense\)
这个能力还可以通过相应的技能加成
hero与master的不同的技能攻击与防御能力与技能加成如下:

master每死一次,就会升级一次,能力也逐渐增强,而hero可选技能,但是只能选择0-3的技能,不能选择到最Bug的DDOS “have botnet”的,所以最强的也就是Overflow Attack,能力也就能与level2的master刚一刚
即使我们考虑回血,hero与master回血能力相同,所以遇到level3的
所以,这样看下来,hero必败。

注意到hero的信息能够存放在文件中,下次玩的时候可直接登录,并且保存等级状态等,每次登录后都将文件mmap到了内存中:

文件的实时数据mmap映射到了内存这样可能会造成Race-conditon,即文件TOCTTOU
我们可以通过开启两个同一个用户下的游戏,一个打怪兽,另一个不断给自己加血来赢得游戏
因为TOCTTOU,每次两个进程的hero的信息,血量等是同步的mmap,所以造成了游戏出现了必胜策略
最后进入vnln函数,做ROP getshell即可

发表评论