flutter逆向初探

前言

flutter逆向真的还挺难的,做的时候搜到的资料里最有用的是这个系列的三篇: https://www.guardsquare.com/blog/current-state-and-future-of-reversing-flutter-apps 。 基本能了解flutter的一个运行机制。 reflutter 对这个题来说是能用的,但是能给到的有效信息并不多所以用处不大。之前照着别的文章做,都是先reflutter然后对着dump出来的offset进行hook, 所以比赛时就卡在这里了。时间也很短,感觉提前没有了解很难在比赛期间做出来。

正向

最后决定照着前言的三篇文章走,所以自己装了个flutter准备bindiff还原符号,没符号真的没法做。 注意编译时候一定要选择release模式,它是AOT的,而debug模式是JIT的, profile带了性能优化是混合了AOT和JIT的。 注意release默认编译是没有符号的,可以通过–split-debug-info=./YOURFOLDER 指定编译出符号文件。 之后通过 https://github.com/Guardsquare/flutter-re-demo 里的脚本将自己编译的flutter中的libapp.so还原符号。这里也很推荐大家可以试着调试自己的libapp.so, 试着找到自己编写的代码里一些button的回调函数,找到的调用链往往也能用在题目上。

逆向

用bindiff还原题目符号表以后,发现还是很折磨。 最后上了动调,参考了flutter引擎源码,断在了GestureRecognizer::invokeCallback 这个函数上。 通过对自己代码的动调分析和对题目的动调分析,可以知道点击事件基本是经过了GestureRecognizer::invokeCallback -> InkResponseState::handleTap_0 -> State__setState -> 自定义的代码。 其中 GestureRecognizer::invokeCallback 里的callback其实相当多,动调的时候还是要注意过滤,多看看。 找到位置以后实际上的逆向逻辑很简单,所以前言文章里的第二篇我并没有复现(其实是我找不到SharedPreferences::getInstance 导致第一步的hook Dart objects就失败了,但是知道原理的话可以颅内大致的deserialize一下,当然要是有人知道了可以教教我)。 因为可以动调的缘故,而且加密只是简单的异或,所以断在位置上可以直接dump,直接贴一下代码好了。

后记

对于flutter有了一点点小理解,libapp.so里混合了大量的flutter本身的编译结果导致逆向尤其困难。但是如果只是针对ctf题目的话,可能set_state函数是一个很关键的可以用于定位用户自定义代码的函数。如果碰到困难可以多看看flutter源码。最后,这题目真可恶啊,被flutterror的名字骗了,找了半天throw出来的错误哪里catch,结果发现题目就是一个简单的点击事件…


比丘资源网 » flutter逆向初探

发表回复

提供最优质的资源集合

立即查看 了解详情