Reverse

前言

一个人做题确实很累,做题目数量太少感觉效率很低,NaCl做出来都已经晚上十点了,不过这次比赛能做出来两道也算是进步了,能切实的感受到水平提升果然令人高兴。(水平太差只做了两道RE,希望大佬看到多多指点)

Simple File System

四个文件,simplefs是主程序elf文件,flag里显示了flag的格式,instruction.txt介绍了使用方法

依次输入format、mount、plantflag、exit

可以看出来plantflag是关键代码

image-20220418154025089

从各种字符串来看,可以猜测是打开了image.flag文件然后类似于光碟的方式把加密后的代码注入到image.flag文件里。所以最开始的image.flag就包含了真正的flag(刚刚操作后会覆盖一部分内容,所以解密得使用原来的文件)

题目其实存在大量暗示,v21和v22都是rand()出来的,没有具体时间作为种子是不可能解密的

image-20220418154622846

三串都调用了sub_1E16,可以任务这个就是加密算法了

注意到传参时只有中间的代码传入了1,另外两个和rand有关的都传入了2

image-20220418154750690

很显然,传入2和传入1会调用不同函数

image-20220418154823171

sub_2305调用的rand()忽视

image-20220418154853203

移位加上异或,都是可逆的算法,相比是真正的加密算法了

image-20220418155033555

image-20220418155056334

分析文件格式对每32位解密,其中能得到一串明显是flag的字符串

*CTF{Gwed9VQpM4Lanf0kEj1oFJR6}

NaCl

没搞懂题目那个google的NaCl的意思,甚至没怎么看文档,不过还是能逆出来,就是十分吃力基本是硬逆的

image-20220418155312393

找到主程序,可以看出来sub_8080900是关键函数

点进去直接云里雾里,看F5反汇编是看不出东西的

image-20220418155458183

被ida识别为程序领空的内容非常多,观察图像却发现有四个入口点

调试了以后发现开始程序最后会jmp rdi,利用寄存器跳转(这就是ida无法反汇编的原因)

中途会经历很多不同的程序再回到loc_8080980(前面部分先跳过不看)

image-20220418155901775

观察程序结构会发现会进行一个循环(见到这个结构就让人怀疑是加密程序)

这里我由于看汇编实在是太累

image-20220418160023586

我讲loc_8080720最后的jmp loc_8080360修改为jmp loc_8080980

image-20220418160138365

这样f5就能看到循环的反汇编了,很明显是XTEA;

循环结束后会进入loc_80809c0

这里是把我们加密后的密文放到flag的密文附近

然后与密文进行比较,比较其实就是一开始反汇编内容的else

本以为就是简单的XTEA,果然还是想多了

再jmp rdi后会进行多个跳转才会进入rdi

这里我使用内存断点对输入内容进行跟进,会发现一开始对输入内容进行了大小端转换然后进入一个加密算法

image-20220418160822134

由于每个指令最后都使用jmp rdi来跳转,没法像刚刚一样偷懒修改程序然后F5,只能看汇编了,还好汇编程序内容不长

t=x1

x1=(t<<1&t<<8)^(t<<2)^x0^key[i]

x0=t

大概是这个算法

逻辑明白后就是写解密算法了

image-20220418161042557

算法并不完整(注意的是每次XTEA循环次数都不同,分别是2,4,8,16)


努力学习逆向