SUSCTF|WP:CrakeMe 一道android逆向

前言

可能是第一次单字节手动爆flag

开始

这题是一个涉及到so动态调试的apk。我之前都是用红米note来进行动态调试的,因为android4.4感觉脱壳比较容易,但这次的版本要求为api 26也就是android8.0.这就有点蛋疼了,还好我自己用的手机够格,所以就拿自己手机上了。先是搭了一波环境,64位32位搞不清了都,ida附加了半天没附加上去,最后使用64位来调的。
SUSCTF|WP:CrakeMe 一道android逆向_第1张图片
SUSCTF|WP:CrakeMe 一道android逆向_第2张图片

check1函数的过程比较的简单,关键在native层的check函数。

SUSCTF|WP:CrakeMe 一道android逆向_第3张图片

check函数中最棘手的恐怕是srand()rand()这两个随机数了,它是产生一个随机数然后和我们的输入相加,在和一个固定的数组进行比较,flag长度为28位。我采用的方法比较笨,就是动态去跟,得到每次的随机数然后求出正确的v4,最后可以得到全部的输入序列。在通过脚本解密序列,得到flag。我在求解flag时,懒得的整体的脚本,就写了局部的爆破单个字母的脚本。最后几个字符时猜测出来的,所以序列也没求完整。

#random的值每次都会变化
35FCFD38 random
#求得的正确的输入序列
ac f9 aa e9 bd fb 80 e8 89 ff 9a c5 a3 d6 b8 e7 90 f9 8d e5 ba d4 b5 c1 a8.
#用来比较的v3数组
93 96 1A 57 34 60 A9 23  8C 3D 94 6A ED 22 92 1F
81 7C 88 73 57 A2 13 5C  22 75 40 26 3A 6A 64 13
7F 53 39 21 5F 5C 41 35  B7 04 13 32 26 8C 8A 23
F6 07 73 0D 68 52 2D 62  04 2E 3D 7C 7E 8F 19 72
F2 6A F7 7D AA 31 84 4E  61 08 65 28 E9 E3 D8 0F
1A 1F 6C 19 B3 8A FE 05  5D 49 31 12 98 D9 59 53
E0 FD FC 35 D4 0D 2D 3B  45 3E 11 61 B8 57 4C 31

贴出脚本:

根据得到的输入序列,爆破出正确的单个字符
for j in range(0,255):
        t=j^0xac
        if t==0xf9:
            print chr(j)
#SUSCTF{have_fun_with_nati}
#SUSCTF{have_fun_with_native}

总结

这题也是学习了,刚开始卡壳了很久,一直在纠结怎么将版本限制给取消了,要不要对着它的加密过程自己写一个一样的或者说能不能利用他给的so库,刚开始的思路有很多,但都感觉不是很实际,最后比较运气,老老实实的动态的跟了一遍。
ps:志愿者不是小姐姐差评!

你可能感兴趣的:(CTF,android)