一、题目来源

    题目来源:XCTF题库安卓区easyjava

    题目下载链接:下载地址


二、解题过程

    1、将该apk安装进夜神模拟器中,发现有一个输入框和一个按钮,随便输入信息,点击按钮,发现弹出信息You are wrong!Bye~

    2、将该APK拖进AndroidKiller中反编译,反编译完成后,搜索字符串You are wrong,发现该字符串位于MainActivity.java中,如下图所示:

    3、用jeb反编译该apk,反编译完成后直接将smali层代码转为java代码,发现在onCreate函数出现该字符串,发现将输入框中的字符串作为参数传入MainActivity的a(string)函数中,返回的布尔值确认flag是否正确。

    4、而该a函数调用了MainActivity的b函数,b函数返回一个布尔值,b函数作用为首先获取输入框的字符串截取前5个符flag{与最后一个字符}之间的字符串。

    然后实例化了一个b类,并且传入了一个参数2,而b类的构造函数首先为一个整形数组复制,然后左移该整形数组,左移的次数就是传进来的整数,这里是2。

    在然后实例化了一个a类,传入了一个参数3,而a类的构造函数与b类的构造函数基本相同,就不再说了。

    之后遍历截取下来的字符串的每个字符,然后将调用MainActivity中的a(string,b,a)函数返回回来的字符串添加到变量v3的尾部,遍历完后,将得到的字符串与字符串wigwrkaugala比较,若结果为真,返回True,否则返回False

    5、接着来看MainActivity的a(string,b,a)函数,该函数首先将传进来的第一个字符串作为调用b类的a函数的参数传入,然后将返回回来的结果作为调用a类的a函数的参数传入,最后返回一个字符。

    再来看b类的a函数,该函数首先获取传进来的字符在字符串b.b中的索引,然后得到在b类中定义的整形数组中与该该索引相等的在数组中的索引,然后调用b类的a()函数,该函数作用为将b类中数组与字符串左移一位,然后返回该数组索引。

    接着再来看a类中的a(int)函数,该函数首先获取与传进来的参数相等的数组中的值的索引,然后获取在字符串中索引为该数组索引的字符,最后返回该字符,当然,其中也调用a()函数,但是该函数要求等于25,所以该函数木有任何作用。

    6、上面几步以及详细讲述了该apk的flag加密流程,要获取flag,逆向解密即可,解密脚本跑出结果如下:


三、附件

解密脚本:(要求python版本3.6或者与上)

cipherText = 'wigwrkaugala'

aArray = [21,4,24,25,20,5,15,9,17,6,13,3,18,12,10,19,0,22,2,11,23,1,8,7,14,16]
aString = 'abcdefghijklmnopqrstuvwxyz' bArray = [17,23,7,22,1,16,6,9,21,0,15,5,10,18,2,24,4,11,3,14,19,12,20,13,8,25]
bString = 'abcdefghijklmnopqrstuvwxyz' def changeBArrayandString():
global bString
global bArray
chArray = bArray[0]
chString = bString[0:1]
for i in range(len(bArray) - 1):
bArray[i] = bArray[i + 1]
bArray[len(bArray) - 1] = chArray
bString = bString[1:]
bString += chString def getBchar(ch):
v2 = bArray[ch]
arg = bString[v2]
changeBArrayandString()
return arg def getAint(ch):
global aString
global aArray
v1 = aString.index(ch)
arg5 = aArray[v1]
return arg5 print('flag{',end='')
for k in cipherText:
v0 = getAint(k)
print(getBchar(v0),end='')
print('}')

最新文章

  1. Azure Redis Cache
  2. Jumony快速抓取网页 --- Jumony使用笔记--icode
  3. do while(false)实用技巧
  4. hdu 5802 Windows 10 贪贪贪
  5. CentOS6.x 64位下mysql5.5.25安装图解教程
  6. ScannerTest-------double string
  7. codevs 3269 混合背包
  8. (@DBRef)spring-data-mongodb
  9. makefile编写差异
  10. 【matlab编程】matlab随机数函数
  11. 2018-CVTE中央研究院-自然语言处理算法工程师-电话初面问题
  12. [20170603]12c Top Frequency histogram.txt
  13. 一、PHP_OSS使用
  14. Learning-Python【4】:Python流程控制与循环
  15. html select控件的jq操作
  16. Qt Quick Dialogs
  17. 安装Python时遇到的api-ms-win-crt-runtime-l1-1-0.dll 丢失问题
  18. LeetCode(11):盛最多水的容器
  19. C++笔记015:C++对C的扩展——三目运算符功能增强
  20. Java 读取Excel2007 jar包冲突的问题(org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException)

热门文章

  1. freeswitch的internal的profile无法启动
  2. Python 网站后台扫描
  3. jQuery插件开发小结
  4. [LC] 379. Design Phone Directory
  5. C 语言高效编程与代码优化
  6. dos窗口运行python文件提示找不到模块
  7. Sublime Text2 使用心得总结
  8. Flash Builder 使用
  9. 吴裕雄--python学习笔记:通过sqlite3 进行文字界面学生管理
  10. Json格式化的实现(Jackson、Gson)