XCTF---easyjni的WriteUp
一、题目来源
题目来源:XCTF的mobile区的easyjni题目。
题目下载地址:题目链接地址
二、解题过程
1、下载好题目后,安装到夜神模拟器中,发现有一个输入框和一个按钮,随便输入内容,点击按钮后发现弹出信息You are wrong!Bye~
2、将该apk拖进AK中反编译,反编译完成后搜索字符串You are wrong!
,发现该信息位于MainActivity.java中。
3、用jeb反编译直接查看反编译后的java代码,发现zaiMainActivity中首先导入了一个名为native的so文件,然后查看You are wrong!Bye~
信息处发现将输入框得到的字符串与MainActivity的b属性作为参数调用MainActivity中的a(string,string)
方法返回的布尔值作为是否通关条件的。
4、再来看一下a(string,string)
方法,该方法返回第一个参数调用的a(string)
方法的返回值,传进去的参数为输入框中的字符串,而方法a(string)
则是调用ncheck
方法,返回值也是ncheck
函数的返回值,传进去的参数则是调用实例化了a类的a函数的返回值,a类的a函数传进去的参数为一个字节数组,再去看一下a类的a函数,很明显是一个base64加密,只是编码表变了一下而已。
a(string)
函数:
private boolean a(String arg3) {
boolean v0_1;
try {
v0_1 = this.ncheck(new a().a(arg3.getBytes()));
}
catch(Exception v0) {
v0_1 = false;
}
return v0_1;
}
5、用ida打开so文件,找到ncheck函数,发现将传进来的字符串首先将前16个字符和后16个字符交换位置,然后将这个新字符串两两一组互相交换位置,最后和一个字符串比较,相等则返回TRUE
。
6、获取flag思路也很简单了,首先将字符串两两一组交换位置,然后将前16个字符和后16个字符交换位置,然后将这个新的字符串用自定义的basr64编码表解码即可得到flag,写了个脚本,跑出来结果如下:
三、附件
获取flag的python脚本如下(需要python版本至少为3.6):
def Base64Decode(str_list):
list_base = []
a = str_list[0] << 2
c = str_list[1] & 15
b = str_list[1] >> 4
a = a | b
list_base.append(a)
c = c << 4
a = str_list[2] & 3
b = str_list[2] >> 2
c = c | b
list_base.append(c)
a = a << 6
a = a | str_list[3]
list_base.append(a)
return list_base
CodingTable = 'i5jLW7S0GX6uf1cv3ny4q8es2Q+bdkYgKOIT/tAxUrFlVPzhmow9BHCMDpEaJRZN'
Ciphertext = 'QAoOQMPFks1BsB7cbM3TQsXg30i9g3=='
i = 0
flag = ''
while i <= (len(Ciphertext) - 1):
list1 = []
n = 0
for k in range(4):
if Ciphertext[i + k] == '=':
list1.append(0)
n = n + 1
else:
list1.append(CodingTable.index(Ciphertext[i + k]))
ba = Base64Decode(list1)
for j in range(3 - n):
ch = chr(ba[j])
flag = flag + str(ch)
i = i + 4
print(flag)
最新文章
- kubernetes部署Fluentd+Elasticsearch+kibana 日志收集系统
- Windows 8.1 新增控件之 MenuFlyout
- hdu 4763 kmp ***
- Radio Basics for RFID
- 201521123063 《Java程序设计》 第14周学习总结
- 「mysql优化专题」90%程序员面试都用得上的索引优化手册(5)
- WordPress禁止版本修订历史、自动保存和自动草稿最新方法汇总
- Java ftp 上传文件和下载文件
- scrollTo不起作用
- mysql5安装
- DLC 格雷码
- php获取数据库中数据
- DownloadProvider 源码详细分析
- SWF加载器控件 SWFLoaderControl
- this、apply/call、bind、闭包、函数、变量复制
- Jmeter(三十二)Jmeter Question 之 “自定义函数开发”
- 【IT笔试面试题整理】判断一个树是否是另一个的子树
- [android] fragment的动态创建
- 【Java】详解java对象的序列化
- C# SpinWait
热门文章
- string 转化xml &;&; xml转化为string
- 在Python 中怎么表示一个元素在一个list中的数量?
- CPU内核、用户模式
- deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面
- [LC] 74. Search a 2D Matrix
- try中定义的变量在finally中找不到
- mapreduce.shuffle set in yarn.nodemanager.aux-services is invalid
- inventor安装未完成,某些产品无法安装的解决方法
- 洛谷 P1220 关路灯 题解
- JavaScript的数据类型有哪些?