DDCTF-逆向部分writeup
0x01
DDCTF比赛形式比较新颖,是解答一道题后会获得一个邮箱,将writeup发送到邮箱后会给你回复下一个题。而且是逆向和web交叉,如果解答不了当前题目就无法进入下一题,它考察一个人的综合技术素养。这个比赛到目前还没有结束,它为期十三天,但是邻近期末,各种结课作业,各种考试接踵而至,早已没有精力和时间再去做它了,所以提前写个博客记录一下比赛心得。
第一题
这个题是个64位的ELF文件,分析后我们发现byte_100001040[]这个数组里面的值做处理后得到v2,然后又将byte_100001040[]数组里面的之挨个减去2后,又和v2进行了按位亦或操作。然后输出结果。
下面是byte_100001040[]数组里面的值。
既然我们不知道V2的值,那我们对V2进行爆破,然后求得结果。
爆破脚本如下:
结果如下:
第二题
这道题是个APK,用AndroidKill不能查看java伪代码,但是Android逆向助手可以。我们发现验证条件就是将我们输入的字符串和i()这个函数返回值对比是否相等。
我们直接将这段java伪代码复制下来稍作修改,跑出i()函数的返回值,即flag。
结果如下:
第三题
这个题是刚开始时一脸懵逼,它给了一个exe文件,一个x.jpg,一份Readme.txt
然而Readme是什么意思没看懂,到底x.jpg有什么用也很纳闷。
不管那么多了,先用文件格式分析器,查壳工具等等分析一波,发现这是个32位的exe文件,加了UPX壳,我们用ESP定律法两次脱壳后用IDA进行分析。
我们发现这个程序的逻辑就是先访问 http://www.ddctf.com/x.jpg, 然后将x.jpg的内容读取进来,进行了一些操作,最后返回一个reusult。
我们用IIS在本地搭建web服务,使得程序能访问http://www.ddctf.com/x.jpg。
读取到x.jpg的内容后进行了如下操作,我们发现如果if条件成立reusult就是flag
用OD动态调试脱壳后的程序,修改JMP语句为跳转,得到flag。