注:在次之前并没去学习过flutter,所以这里从0开始分析
习惯性先运行看效果


其实不是我第一次接触flutter了,所以看到这个图标还算认识

知道是flutter后,开始思考开发者写的源代码会处于哪个位置,一般这种框架都是在lib中,不过此处有3个lib,对于初学者来着说并不了解作用的情况下就可以自己学习开发一下然后逆向自己开发的软件
当然这里是dart3.5,若是以后版本更新了可能很多多西会对不上,这里提一下
Google官网有演示demo,我也是对着学了一遍才往后看的
https://codelabs.developers.google.cn/codelabs/flutter-codelab-first?hl=zh-cn#0
学完官方的演示demo之后自己构建一个输入验证软件,效果如下

第一次编译时间较久,我大概编译了20分钟
这时候如果直接用ida逆向分析会发现没有符号,默认就是这样,不需要选择剔除,但是根据字符串搜索还算可以得知lib文件下的applib.so才是开发者写的代码,另一个libflutter.so应该是框架代码
这时想起之前看的ACTF中也有一个这样的题,提到了一个blutter工具,用于逆向flutter软件
https://github.com/worawit/blutter
相关的环境配置github上也有说明,不过直接在传统命令行上执行会失败,得在visual studio带的命令行上,也就是下面这个

然后按照官方文档操作就能得到几个文件夹,包含了ida脚本,dart源码,frida脚本等,不过dart源码是汇编的形式

现在需要用的是addname.py这个ida脚本,能恢复符合

恢复符合后思考如何找到开发者的代码,这里按照传统的字符串定位方法是不行的,因为flutter的热重载机制,字符串甚至都没有引用,在静态分析下不能定位
此处我用了个比较麻烦的版本,那就是编译两份程序,在验证时一个写==一个写!=,然后使用hexcmp进行比对

hexcmp的比对结果显示不同点位于297ce0的位置

然后找到297ce0的位置处进行反汇编,成功定位到我自己写的验证函数处


值得注意的是自己写的函数符合也被保留了下来,叫下面这个名字

而源码中我是这么写的

但是这个最终比对函数也没有交叉引用,无法通过静态分析寻找调用链

不过也根据函数名知道了开发者的代码搜app的名字就能找出来了

关于按钮函数的定位,找到文章说搜ontap能定位到按钮函数,不过这些函数都是无交叉引用的,在静态分析下没有什么意义,不如直接搜app名字定位到开发者写了哪些代码,回到bytectf中,直接搜app的名字

如果前面跟着google官方的演示demo敲一遍代码,了解一下dart语言框架,不难看出按钮的触发函数位于MyHomePageState中,主要逻辑也在这个MyHomePageState_test中

这里的showToast猜测就是输出成功or失败等信息,毕竟安卓开发里也有toast,那么判断函数就是在babyapk_src_rust_api_simple::m3n4B5V6_265088中,他这里调用的是rust语言的代码,而刚好题目里还要一个关于rust语言的so库,那么加密逻辑就在那个so里面,不过后面搭建rust开发环境和dart语言调用rust语言的开发就没去了解了,这里也能网上找到如何定位的,直接通过字符串就能定位到调用代码处

然后对着解密就行