[GKCTF 2021]App-debug

发布时间 2023-06-07 02:16:36作者: 古明地核

WP

最近忙活很多事,很长时间没有认真刷题了,于是今天特训了一波。
正好遇到一道有点意思的题目,于是记录下来。谈不上WP,更多是记录一点做题的心路历程吧()

安装,查看概况

image-20230607005048252

用一个输入框判断是否符合flag,挺清楚的。

反编译

jeb打开

image-20230607005212035

​ 可以看到,程序对flag检测的关键是check()方法,但是class文件里面并不存在算法内容。结合上面的loadlibrary,可以推测程序调用了native层即so文件中的方法。

​ 又因为check仅仅返回了一个bool值,所以我们没办法在java层通过hook得到flag。必须深入一层了。

拆包,静态分析

image-20230607005731013

lib下面只有个v8a版本的so……但凡我的逆向机再老一点,这程序就铁定跑不起来了

函数窗口里面搜索check,很容易找到check方法的代码了

image-20230607010021559

这里有不少陌生的函数,按顺序一个个深入分析太浪费时间,所以反过来找,从return v5开始分析改变返回值的函数,直接就能找到关键代码了。

image-20230607010441644

是典型的tea加密。

delta、key、密文都齐全了,直接开始解密捏

image-20230607011017336

这值好像不太对啊……
刚开始我以为是前面的函数对其进行了预处理,所以花了很长时间向前分析,结果发现根本没有任何效果。

没办法,上动态调试喽。

动调

ida上传server,adb端口转发,附加程序调试,一切顺利

并且在关键变量处全部加上监视,以免看漏。

image-20230607012552440

image-20230607012812403

果然有变化!可以对比一下静态分析下的数值

image-20230607013337161

交叉引用,发现篡改数据的函数

image-20230607013426515

image-20230607013607550

这其实是一个反调试手法,程序通过检测treacerpid来判断自己是否在被调试。如果检测到没有被调试的话,会将key值换成真的key。

TreacerPid,可以直接理解为“跟踪本进程的进程的pid”,可通过"cat/{进程pid}/status"来查看。所以绕过方法也很简单,将其改为0即可。

将正确的值换上去之后,就可以正常解密了:

image-20230607014613986

这里需要自行调整一下顺序

image-20230607014639530

md5加密后即可

image-20230607014657287

后话

于是又出现了一个新问题——我明明确实用了ida来附加调试,可为什么没有被检测到呢?

继续交叉引用,在这里可以看到,反调试函数的位置是在so文件加载的入口或者说初始化位置。

image-20230607014941143

结合java层代码,可以发现反调试函数在打开应用的那一刻便被执行完毕。后期程序既没有再次调用该函数也没有开新线程来检测。而我们偏偏就是在应用运行途中附加上去的,所以绕开了检测……

image-20230607015300633

要是这个反调试能正常运行的话,这个题目其实会棘手不少。只能说出题人有心挖坑,但最终还是手下留情了()