2017 SSCTF 加密勒索软件 100

压缩包内有一个Excel表格文件,打开显示损坏,猜测可能加密了,JEB载入APK样本,发现仅仅是Java层做处理,第一次打开应用的时候,会读取Sharedpreferences文件的isEncryptrd字段,第一次读取该字段,该字段为0,所以会要求用户输入6位数字作为密码

在输入密码后,除了把isEncrypted改为1之外,就没有其它的操作了

当第二次输入密码,会调用check2()进行处理

check2()函数在判断密码是否为空以及长度是否为6之后,调用了verify2()函数

verify2()函数有两个参数,第一个参数通过函数调用的返回值来确定

ToolsUtils.getSignInfo()获取该应用签名的32位MD5值

verify2()函数第二个参数是一个写死的MD5值

verify2()函数的校验过程看上去比较复杂

在这里纠结了一会儿,感觉乱糟糟的

后来实现想不下去了,于是决定看一下后面的代码,发现了这是一个坑

在前面的代码中,check2()调用verify2(),但是在校验通过后,并没有对Excel表格文件的解密处理等操作,也没有读取文件相关的代码

这就尴尬了

在上下翻看代码的过程中,发现有读取文件的操作函数,通过k1数组跟ctf1_encode.xlsx进行异或,相隔256个字节异或一次

找到k1的定义,并没有进行初始化

发现k1的初始化是在一个函数里进行的,这里的arg11应该就是输入的6位密码

6位的数字,爆破一下应该是可以的

研究一下文件格式,看一下有没有固定的数据可以直接确定

确定的位置为0x000x1000x2000x3000x4000x500

首先是Magic Number,然后中间一片00

再查看ctf1_encode.xlsx

那么就可以确定前三个数字了

再往下翻,发现两处

正常的Excel是空的

现在可以大概的确定出来的数据

接下来计算一下,强行写的很渣的代码,获取签名MD5这一步可以直接使用代码里的MD5值,反正是一样的,然后生成k1数组,接下来进行计算,判断五个已确定的数据,因为是异或计算,可以再次异或,只要还原为正常Excel的数据即可

最后输出

同时生成9个文件,ctf1_decode_111355.xlsx开始9个文件都是可以打开的

打开后有一张图片

flag : SSCTF{G0odJo13!}

这题不知道是不是因为巧合,0x400的位置不知道是不是凑巧没有破坏文件格式,所以都能打开

Last updated