吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3596|回复: 5
收起左侧

[Android CTF] Xctf 移动逆向 easyjni题解

[复制链接]
buzhifou01 发表于 2020-3-3 12:13

使用工具


  • 1.apktool
  • 2.dex2jar
  • 3.jadx-gui
  • 4.APK查壳工具

解题过程


1.打开查壳工具,无壳,接着把apk拖入模拟器中,并运行,点击check报错
2345截图20200301193843.png
2345截图20200301201117.png
2.那么使用dex2jar来进行反汇编,先是把apk文件的后缀名改为rar,进行解压缩,使用d2j-dex2jar.bat对classes-dex进行反编译,生成classes-dex2jar.jar
2345截图20200302151240.png
2345截图20200302151302.png
3.接着使用apktool工具,反编译apk文件,可以看到so文件
2345截图20200303120209.png
4.把classes-dex2jar.jar拖入jadx-gui中,在下面的代码中,可以看到c是MainActivity类的父类,静态加载了Native层,在onClick中看到了对输入信息进行验证的if语句
temp.png
5.并且使用了ncheck方法(Java中没有函数概念,只有方法),那么必然要分析so层,接着看a方法,看到了new a(),创建了a的实例,那么跟a类有关系了,随后又有a(str.getBytes()),那么就有对字符串进行处理的方法。
2345截图20200303120612.png
6.进入a类,看到了一个编码方法,上面是一个静态私有的字符数组,切换到smail窗口,使用下上行号相减,发现长度为64,显然为base64编码表。
2345截图20200302184045.png
2345截图20200303120707.png
2345截图20200303120711.png
7.接着使用ida打开so文件,看到MainActivity方法,进入,看到输入的字符串的长度为32,字符串中前16个字符跟后16个字符交换位置,往下看到前后字符交换位置的算法
2345截图20200303120836.png
2345截图20200303120848.png
8.可以看到一个关键的字符串,接下来使用idapython脚本来提取该字符串并输出flag
2345截图20200303120855.png
9.脚本代码分两处,第一处获取ida中的关键字符串并对关键字符串进行转换生成base64_flag,代码如下:
[Python] 纯文本查看 复制代码
#找到关键字符串在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[16:]+str[0:16]
	i=0
	t=''
	while i<len(str1):
		#调换前后字符的位置
		t+=str1[i+1]+str1[i]
		i+=2
	print 'base64_flag ',t
for seg in Segments():  
	#如果为代码段,则调用Getbase64
	if SegName(seg) == '.text':
		Getbase64(seg)

运行结果:
2345截图20200303102025.png
10.接着对base64_flag进行解码操作,求出flag。
[Python] 纯文本查看 复制代码
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

运行结果:
ans2.png

easyjni.rar

567.41 KB, 下载次数: 22, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 3威望 +1 吾爱币 +11 热心值 +3 收起 理由
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
女萝岩 + 1 + 1 我很赞同!
mcwindy + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
那年听风 发表于 2020-3-3 12:28
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| buzhifou01 发表于 2020-3-3 13:30
lynxtang 发表于 2020-3-3 13:30
yinsugege 发表于 2020-3-4 00:04
学习了,谢谢!想问楼主有研究过JSC反编JS吗,最近被这个搞得头大
老年小白 发表于 2020-3-7 11:23
楼主威武,小白学习下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表