buzhifou01 发表于 2020-3-3 12:13

Xctf 移动逆向 easyjni题解

## 使用工具

[*]1.apktool
[*]2.dex2jar
[*]3.jadx-gui
[*]4.APK查壳工具

## 解题过程
1.打开查壳工具,无壳,接着把apk拖入模拟器中,并运行,点击check报错


2.那么使用dex2jar来进行反汇编,先是把apk文件的后缀名改为rar,进行解压缩,使用d2j-dex2jar.bat对classes-dex进行反编译,生成classes-dex2jar.jar


3.接着使用apktool工具,反编译apk文件,可以看到so文件

4.把classes-dex2jar.jar拖入jadx-gui中,在下面的代码中,可以看到c是MainActivity类的父类,静态加载了Native层,在onClick中看到了对输入信息进行验证的if语句

5.并且使用了ncheck方法(Java中没有函数概念,只有方法),那么必然要分析so层,接着看a方法,看到了new a(),创建了a的实例,那么跟a类有关系了,随后又有a(str.getBytes()),那么就有对字符串进行处理的方法。

6.进入a类,看到了一个编码方法,上面是一个静态私有的字符数组,切换到smail窗口,使用下上行号相减,发现长度为64,显然为base64编码表。



7.接着使用ida打开so文件,看到MainActivity方法,进入,看到输入的字符串的长度为32,字符串中前16个字符跟后16个字符交换位置,往下看到前后字符交换位置的算法


8.可以看到一个关键的字符串,接下来使用idapython脚本来提取该字符串并输出flag

9.脚本代码分两处,第一处获取ida中的关键字符串并对关键字符串进行转换生成base64_flag,代码如下:
#找到关键字符串在ida中的位置
def findstr(s):
        findstr='4D 62 54 33'
        #查找输入字符串所在的位置
        BinaryAddr=FindBinary(s,SEARCH_DOWN,findstr)
        #判断查找是否失败
        if hex(BinaryAddr)=='0xffffffffL':
                print 'not found'
        else:
                print 'BinaryAddr ',hex(BinaryAddr)
        #返回地址
        return BinaryAddr
def GetStr(s):
        str_addr=findstr(s)
        tstr=''
        while(1):
                #判断循环是否结束
                if hex(Byte(str_addr))=='0x0' and hex(Byte(str_addr+1))=='0x0':
                        break
                #叠加字符串字符生成字符串
                tstr+=chr(Byte(str_addr))
                str_addr+=1
        return tstr
def Getbase64(s):
        str=GetStr(s)
        #调换前后一半字符串的位置
        str1=str+str
        i=0
        t=''
        while i<len(str1):
                #调换前后字符的位置
                t+=str1+str1
                i+=2
        print 'base64_flag ',t
for seg in Segments():
        #如果为代码段,则调用Getbase64
        if SegName(seg) == '.text':
                Getbase64(seg)
运行结果:

10.接着对base64_flag进行解码操作,求出flag。
import base64
import string
def GetAns(base64_flag):
        a = ['i', '5', 'j', 'L', 'W', '7', 'S', '0', 'G', 'X', '6', 'u', 'f', '1', 'c', 'v', '3', 'n', 'y', '4', 'q', '8', 'e', 's', '2', 'Q', '+', 'b', 'd', 'k', 'Y', 'g', 'K', 'O', 'I', 'T', '/', 't', 'A', 'x', 'U', 'r', 'F', 'l', 'V', 'P', 'z', 'h', 'm', 'o', 'w', '9', 'B', 'H', 'C', 'M', 'D', 'p', 'E', 'a', 'J', 'R', 'Z', 'N']
        #把a生成字符串
        Tbase64= ''.join(a)
        #默认的编码
        base64_rel="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
        #把默认的编码表变成程序自定义的编码表
        string_rel = string.maketrans(Tbase64,base64_rel)
        #把上述代码输出的base64_flag转换成上述编码表对应的字符串
        Encode_flag = base64_flag.translate(string_rel)
        #解码
        flag = base64.b64decode(Encode_flag)
        print 'flag ',flag
运行结果:

那年听风 发表于 2020-3-3 12:28

buzhifou01 发表于 2020-3-3 13:30

金手指教育 发表于 2020-3-3 13:22
能不能分享一下工具?

爱盘有下

lynxtang 发表于 2020-3-3 13:30

学习了,顺便工具库新增一个工具PKID。{:1_893:}

yinsugege 发表于 2020-3-4 00:04

学习了,谢谢!想问楼主有研究过JSC反编JS吗,最近被这个搞得头大

老年小白 发表于 2020-3-7 11:23

楼主威武,小白学习下
页: [1]
查看完整版本: Xctf 移动逆向 easyjni题解