ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

XCTF-easydex

2020-08-12 13:00:26  阅读:368  来源: 互联网

标签:dex easydex base64 解密 v3 查找 data XCTF


前期工作

查壳,无。安装打开黑屏。

逆向分析

用jadx打开看看

image-20200811184734895

什么都没有,但可以看一下AndroidManifest

image-20200811184845481

可以看到这个是个纯C/C++写的,没有Java代码,是个NativeActivity。

但是后面又有个MainActivity,所以可能是运行so之后就会放出来一个dex。

NativeActivity的启动函数是android_main,进入so中查看android_main

image-20200812095527315

image-20200812095652511

off_43A18存的是0x3CA10

开始把0x7004开始的长度为0x3CA10的数据拷贝到v3里

然后一顿操作后提示

image-20200812095949690

想想都知道正常人是肯定做不到的,继续往下看

image-20200812100140977

v14应该就是手机摇动次数了,如果符合要求的话就解压v3到dest然后写入一个文件。v3存的应该就是dex了。将内容dump下来。

image-20200812104155841

image-20200812104054973

通过对比很明显,这个不是dex,猜测有加密,回到前面看看

image-20200812104520959

这块地方操作了off_43A18和v3,所以这里应该是解密部分,前面应该是获取手机摇动次数。看看这里 发生了什么

image-20200812105904374

编写解密脚本,其实就是将IDA翻译成python

import zlib

with open('d:\\easydex', 'rb') as f:
    data = list(f.read())
    size = 0x3ca10
    times = 0
    while True:
        if times <= 0x59:
            t = int(times / 10)
            if times % 10 == 9:
                s = int(size / 10)
                x = (t + 1) * s
                if s * t < x:
                    c = 0
                    for _ in range(s):
                        data[s * t + c] = data[s * t + c] ^ times
                        c += 1
                if times == 0x59:
                    while x < size:
                        data[x] = data[x] ^ 89
                        x += 1
                    break
        times += 1

fbytes = bytes(data)
with open('easydex.dex', 'wb') as f1:
    f1.write(zlib.decompress(fbytes))

得到dex放入jadx继续分析

文件结构

image-20200812120936026

MainActivity

image-20200812121429814

监听器是a,

image-20200812121529384

查找这个资源id

image-20200812122023842

image-20200812122931896

猜测是twofish加密了,I have a male fish and a female fish.这个应该是密钥,明文加密钥加密得到m正确即可

再回看MainActivity中的m,居然有负数。其中Byte.MIN_VALUE数值为-128。

查找资料

image-20200812124503891

编写脚本解密后得到的不是可读字符,网上在线twofish的结果是base64编码的,所以将结果进行base64

最终脚本

import base64

flag = [-120, 77, -14, -38, 17, 5, -42, 44, -32, 109, 85, 31, 24, -91, -112, -83, 64, -83, -128, 84, 5, -94, -98, -30, 18, 70, -26, 71, 5, -99, -62, -58, 117, 29, -44, 6, 112, -4, 81, 84, 9, 22, -51, 95, -34, 12, 47, 77]

data = []

for i in flag:
    data.append(i&0xff)
print(base64.b64encode(bytes(data)))

image-20200812124915457

拿去解密

image-20200812124954650

得到flag

FLAG

qwb{TH3y_Io<e_EACh_OTh3r_FOrEUER}

总结

做这题真是学到了很多东西,也掌握了一些技巧。首先看到黑屏且没有代码很慌,查看Manifest之后又去查找资料才知道这个是NativeActivity,之后dump内存用的脚本也是上网查找资料才知道又idaapi这种东西,查找字符串资源的时候因为jadx在资源文件中搜不到所以将项目导出后用AndroidStudio打开查找才找得到,什么zlib之类的也是第一次看见,这题查资料学东西花了两天。

标签:dex,easydex,base64,解密,v3,查找,data,XCTF
来源: https://www.cnblogs.com/S1mba/p/13489979.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有