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 13:22
能不能分享一下工具?
爱盘有下 学习了,顺便工具库新增一个工具PKID。{:1_893:} 学习了,谢谢!想问楼主有研究过JSC反编JS吗,最近被这个搞得头大 楼主威武,小白学习下
页:
[1]