Trustme
正面解题
一个登录界面,有回显

看到先执行了 com.swdd.trustme.ProxyApplication 类,点进去看不懂,先看看Main

这下看懂了,但是没有上述的回显(这是一个信息,第一次看没发现)

尝试进行解密 得到 The Real username is admin ,输入后同样的回显,但是没有找到password的检测逻辑,所以又回去查看那个很复杂的类

apk开始运行时会检测有无 shell.apk 解包后发现是没有的,进入 if 语句,创建 shell.apk 并将动态的dex和lib文件存储在新创建的两个文件夹中
readDexFileFromApk() 方法将apk目录下的 classes.dex文件全读了进来

取倒数四个字节为长度,然后以这个长度读取末尾的数据取反后,写入 shell.apk

下面的函数是通过反射获取当前进程的 ActivityThread 实例 然后通过包名的弱引用找到 mPackages 字段,并创建一个 Dexclass,将Thread改为 shell.apk 并执行其中的逻辑
这里就可以看到之前的回显的字符串了,这里有个显然的SQL,可以直接注入 ' OR 1=1 -- ,或者可以直接从mydb.db中异或得到 .sqlite 直接在库中搜索 flag 也能找到



借鉴官方WP
可以直接在运行的时候输入下面的命令
adb shell dumpsys window | findstr mCurrentFocus
# 查询当前页面运行的包名和正在运行的方法名
可以找到当前正在运行的情况 mCurrentFocus=Window{4230039 u0 com.swdd.trustme/com.swdd.tru5tme.MainActivity} 可以看到不是原来 apk 中的那个方法
可以直接将文件拖出来(但是我直接adb pull 拉不出来,一直没权限,需要将文件cp到sdcard中,很奇怪虚拟机还能没权限,可能是应用的运行目录没有权限访问) 最后可以直接得到 shell.apk 不用分析那一坨逻辑
ez_enc
主逻辑很简单,主要记录一下z3在使用的时候注意
S.add(flags[0] == ord('f') or flags[0] == ord('F')) #错误写法
# 表示两者选其一的时候需要用内置函数 Or
S.add(Or(flags[0] == ord('f') , flags[0] == ord('F'))) #正确写法

顺序打印输出 out 为解 i 为创建的变量,按照flags中变量创建的顺序对解出的结果进行打印