Happy Fool's Day~愚人节快乐!今天你有被套路吗?
今天我们不开玩笑,来认认真真看KCTF 第六题《REPWN》不知道这道题有没有让你怀疑人生呢?
本题围观人数为2553人,共有94支队伍攻破成功,第一血由“pizzatql”用时13786s摘得。
出题战队
战队成员:findreamwang
个人主页:https://bbs.pediy.com/user-739734.htm
个人简介:HaCky,目前就读于西安某高校网络工程专业,现在主要的研究方向是病毒分析和内核研究(即将要学),大一开始学习安全技术。第一次参加KCTF,编码方面多有不足,请各位大佬轻打!
看雪CTF crownless 评委 点评
此题使用了pwn题和re(逆向)题相结合的方式,还涉及了DES加密的识别,考察了DES的理解。总的来说,是一道考察选手综合能力的好题目。
题目设计思路
题目信息
参赛题目:Repwn
题目答案:
20101001X1Y0uN3tG00dHaCkWel1C0me
题目设计
本题使用的Pwn题和Re题相结合的方式,考察选手的综合能力。
首先,编码不加任何混淆和反调试,题目友好,在入口处不对字符串设置加密。
其次main流程简单,易于理解,设置两层check
逆向思路简单,难度小。
同时也有计算题,此处不设置麻烦的运算,这样无趣。
最后需要构造溢出点,这样更加贴近实战,写exp等。
然后是溢出的地方,这里涉及到DES的识别问题,可以人工识别,最好是软件识别。本人菜鸡就不想搞变形的DES,这样难度会挺大的,能力也有限。
另外,对关键的字符串进行加密防止直接找到入口点,例如恺撒,异或。
同时也考察了DES基础理解,因为有个比较cmphex是40个,但是des只有32个字节。哈哈,小心机一把。
格式为第一次输入+第二次输入
破解思路
0x01 查壳
不存在任何壳。
0x02
拖入IDA中看到,定位到主函数,可以看到程序经过了两层验证check1和check。
0x03 过check1
得到大概key为xxxxxxxx(8位)X1Y0uN3tG00dxxx(x为未知数据,长度未知)
0x04 过check2
首先长度为24,进入check2_1
Check2_1中
首先将输入转化为Input,然后初始化数字X,Y,Z,我们可以知道x,y,z的生成关系如下:x是input的前四个构成一个4位数,y是input[4-5]构成的2位数,z是input[6-7]构成的2位数,然后解方程,很简单。
得到Input为20101001X1Y0uN3tG00dXXX
然后到达溢出点,目标是寻找溢出点,这个有点坑,方法不唯一,我的想法是这样的:首先查壳的时候发现有DES加密函数,一直交叉引用到溢出点:401C1
现在的问题是如何达到溢出点。00401C10,又由于小端序的问题,顺序应该是101C4000,也就是说input[23]-47=00,也就是说input[23]为47的ASCII,同理,溢出点设计为#$@/,Key为20101001X1Y0uN3tG00d#$@/
0x5 溢出后
之前,我们知道了DES加密。得到加密过程如下
末尾有个比较
引用查看一下:unk_406010,整理出来是40位:但是我们知道DES加密可能会生成32位,不可能生成40位的,所以我们去其32位。秘钥为XiyouNet,DES解密得到:Wel1C0m
解密
最后也提示了flag格式,所以flag为20101001X1Y0uN3tG00dHaCkWel1C0m
网友评论