团队信息:
团队名称:HaCky_
队长QQ:1434905079
题目信息
参赛题目:Repwn
题目答案:20101001X1Y0uN3tG00dHaCkWel1C0me
题目设计
本题使用的Pwn题和Re题相结合的方式,考察选手的综合能力。
首先,编码不加任何混淆和反调试,题目友好,在入口处不对字符串设置加密。
其次main流程简单,易于理解,设置两层check。
逆向思路简单,难度小
同时也有计算题,此处不设置麻烦的运算,这样无趣。
最后需要构造溢出点,这样更加贴近实战,写exp等
然后是溢出的地方,这里涉及到DES的识别问题,可以人工识别,最好是软件识别。本人菜鸡就不想搞变形的DES,这样难度会挺大的,能力也有限。
另外,对关键的字符串进行加密防止直接找到入口点,例如恺撒,异或
同时也考察了DES基础理解,因为有个比较cmphex是40个,但是des只有32个字节。哈哈,小心机一把。
格式为第一次输入+第二次输入
破解思路
0x01:查壳,不存在任何壳
0x02:拖入IDA中看到,定位到主函数,可以看到程序经过了两层验证check1和check2
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为20101001X1Y0uN3tG00dXXXX
然后到达溢出点,目标是寻找溢出点,这个有点坑,方法不唯一,我的想法是这样的:首先查壳的时候发现有DES加密函数,一直交叉引用到溢出点:401C10
现在的问题是如何达到溢出点。00401C10,又由于小端序的问题,顺序应该是101C4000,也就是说input[23]-47=00,也就是说input[23]为47的ASCII,同理,溢出点设计为#$@/,Key为20101001X1Y0uN3tG00d#$@/
0x5 溢出后
之前,我们知道了DES加密。得到加密过程如下
末尾有个比较
引用查看一下:unk_406010,整理出来是40位:但是我们知道DES加密可能会生成32位,不可能生成40位的,所以我们去其32位。秘钥为XiyouNet,DES解密得到:Wel1C0me
解密
最后也提示了flag格式,所以flag为20101001X1Y0uN3tG00dHaCkWel1C0me