flutter逆向初探-- 2023国赛ctf的flutterror

前言

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,结果发现题目就是一个简单的点击事件…

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值