需要安装frida和objection插件进行调试(做题五分钟,装环境两小时[○・`Д´・ ○])
jadx分析:用关键字符串搜索找到主函数(用apk做测试用错误的提示字符串搜索更加容易想到)
大概是取了R.string.cmp中的数据,经过checkflag函数加密了
在资源文件中寻找
得到了疑似flag的数据 49021}5f919038b440139g74b7Dc88330e5d{6
应该是只是经过了顺序颠倒(但愿吧)
用frida下的objection在雷电模拟器里调试该程序
- objection hook的基本命令是:
android hooking watch class_method 方法名 [参数1类型名,参数2类型名...] [--dump-args] [--dump-return] [--dump-backtrace]
这里hook checkflag 函数,在文件中输入一串不重复的数据
>objection -g mobilego explore
Using USB device `Android Emulator 5554`
Agent injected and responds ok!
_ _ _ _
___| |_|_|___ ___| |_|_|___ ___
| . | . | | -_| _| _| | . | |
|___|___| |___|___|_| |_|___|_|_|
|___|(object)inject(ion) v1.11.0
Runtime Mobile Exploration
by: @leonjza from @sensepost
[tab] for command suggestions
com.example.mobilego on (OPPO: 9) [usb] # android hooking watch class_method game.Game.checkflag --dump-return
(agent) Attempting to watch class game.Game and method checkflag.
(agent) Hooking game.Game.checkflag(java.lang.String)
(agent) Registering job 723570. Type: watch-method for: game.Game.checkflag
com.example.mobilego on (OPPO: 9) [usb] # (agent) [723570] Called game.Game.checkflag(java.lang.String)
(agent) [723570] Return Value: ViLdOlJTePKcMYZFQBSHUCXWIaAGkfbDghjNER
得到打乱后的形式,通过脚本模仿打乱方式,完成解密
example="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl"
back="ViLdOlJTePKcMYZFQBSHUCXWIaAGkfbDghjNER"
crypto="49021}5f919038b440139g74b7Dc88330e5d{6"
for i in example:
print(crypto[back.index(i)],end="")
- 恶补: index() 函数用于从列表中找出某个值第一个匹配项的索引位置。
语法:list.index(x[, start[, end]])
x-- 查找的对象。 start-- 可选,查找的起始位置。 end-- 可选,查找的结束位置。
可得D0g3{4c3b5903d11461f94478b7302980e958}
- 获得经验:可以先运行程序看看输出的字符串,然后到反编译软件里搜索输出的报错字符串位置,可以定位主函数!