一、题目来源

    题目来源: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)

最新文章

  1. kubernetes部署Fluentd+Elasticsearch+kibana 日志收集系统
  2. Windows 8.1 新增控件之 MenuFlyout
  3. hdu 4763 kmp ***
  4. Radio Basics for RFID
  5. 201521123063 《Java程序设计》 第14周学习总结
  6. 「mysql优化专题」90%程序员面试都用得上的索引优化手册(5)
  7. WordPress禁止版本修订历史、自动保存和自动草稿最新方法汇总
  8. Java ftp 上传文件和下载文件
  9. scrollTo不起作用
  10. mysql5安装
  11. DLC 格雷码
  12. php获取数据库中数据
  13. DownloadProvider 源码详细分析
  14. SWF加载器控件 SWFLoaderControl
  15. this、apply/call、bind、闭包、函数、变量复制
  16. Jmeter(三十二)Jmeter Question 之 “自定义函数开发”
  17. 【IT笔试面试题整理】判断一个树是否是另一个的子树
  18. [android] fragment的动态创建
  19. 【Java】详解java对象的序列化
  20. C# SpinWait

热门文章

  1. string 转化xml &amp;&amp; xml转化为string
  2. 在Python 中怎么表示一个元素在一个list中的数量?
  3. CPU内核、用户模式
  4. deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面
  5. [LC] 74. Search a 2D Matrix
  6. try中定义的变量在finally中找不到
  7. mapreduce.shuffle set in yarn.nodemanager.aux-services is invalid
  8. inventor安装未完成,某些产品无法安装的解决方法
  9. 洛谷 P1220 关路灯 题解
  10. JavaScript的数据类型有哪些?