Bytectf 2019 NaughtyBoy Writeup
Category: RE
Score: 689
Solved: 10
First blood
题目放出来了一个小时才看题,运气比较好,拿了个安卓逆向一血(估计师傅们都去打n1ctf了
解题过程
拖进JEB,定位到MainActivity,定位到setOnClickListener
跟进发现它把函数名加密了
猜测就是这个native方法来检查输入了:
native层居然没有动态注册方法,很多函数名都没去掉,
看到有两个反调试。
第一个是看tracer pid的:
第二个是看进程中是否有名为android_x86_server的进程:
check中只调用了第二个反调试检测,很容易绕过了,把android_x86_server改个名字就好了。
不管那么多了,直接开始调试
可以看到这获取到的直接是我们的输入,java层没有做任何变换,那就不用管java层那一堆花里胡哨的了,native层这个函数检查了一下开头结尾、长度就进入了sub——400B5B。
这个函数在x86的so中反编译出来又臭又长:
在32位arm的so中比较清晰:
分析发现就是一个消除数字的小游戏,要将数组中的素数也就是0x4f消除掉,只能留中间一个。游戏玩法就不再赘述,观察一下代码即可发现规律。
写出解密脚本
1 | char_array0 = [ |
其他
- native函数中还有一些花里胡哨的操作,调试一下或者复制出来跑一跑就可以知道其功能
- 输入的前四个字节会经过shift函数,有了需要的结果后,我直接暴力跑出来了的。
- idb在附件文件夹中 libnative-lib.idb
- 杂七杂八的c语言脚本
1 | // |