Reverse
前言
一个人做题确实很累,做题目数量太少感觉效率很低,NaCl做出来都已经晚上十点了,不过这次比赛能做出来两道也算是进步了,能切实的感受到水平提升果然令人高兴。(水平太差只做了两道RE,希望大佬看到多多指点)
Simple File System
四个文件,simplefs是主程序elf文件,flag里显示了flag的格式,instruction.txt介绍了使用方法
依次输入format、mount、plantflag、exit
可以看出来plantflag是关键代码
从各种字符串来看,可以猜测是打开了image.flag文件然后类似于光碟的方式把加密后的代码注入到image.flag文件里。所以最开始的image.flag就包含了真正的flag(刚刚操作后会覆盖一部分内容,所以解密得使用原来的文件)
题目其实存在大量暗示,v21和v22都是rand()出来的,没有具体时间作为种子是不可能解密的
三串都调用了sub_1E16,可以任务这个就是加密算法了
注意到传参时只有中间的代码传入了1,另外两个和rand有关的都传入了2
很显然,传入2和传入1会调用不同函数
sub_2305调用的rand()忽视
移位加上异或,都是可逆的算法,相比是真正的加密算法了
分析文件格式对每32位解密,其中能得到一串明显是flag的字符串
*CTF{Gwed9VQpM4Lanf0kEj1oFJR6}
NaCl
没搞懂题目那个google的NaCl的意思,甚至没怎么看文档,不过还是能逆出来,就是十分吃力基本是硬逆的
找到主程序,可以看出来sub_8080900是关键函数
点进去直接云里雾里,看F5反汇编是看不出东西的
被ida识别为程序领空的内容非常多,观察图像却发现有四个入口点
调试了以后发现开始程序最后会jmp rdi,利用寄存器跳转(这就是ida无法反汇编的原因)
中途会经历很多不同的程序再回到loc_8080980(前面部分先跳过不看)
观察程序结构会发现会进行一个循环(见到这个结构就让人怀疑是加密程序)
这里我由于看汇编实在是太累
我讲loc_8080720最后的jmp loc_8080360修改为jmp loc_8080980
这样f5就能看到循环的反汇编了,很明显是XTEA;
循环结束后会进入loc_80809c0
这里是把我们加密后的密文放到flag的密文附近
然后与密文进行比较,比较其实就是一开始反汇编内容的else
本以为就是简单的XTEA,果然还是想多了
再jmp rdi后会进行多个跳转才会进入rdi
这里我使用内存断点对输入内容进行跟进,会发现一开始对输入内容进行了大小端转换然后进入一个加密算法
由于每个指令最后都使用jmp rdi来跳转,没法像刚刚一样偷懒修改程序然后F5,只能看汇编了,还好汇编程序内容不长
t=x1
x1=(t<<1&t<<8)^(t<<2)^x0^key[i]
x0=t
大概是这个算法
逻辑明白后就是写解密算法了
算法并不完整(注意的是每次XTEA循环次数都不同,分别是2,4,8,16)