Android逆向-算法分析入门题
本帖最后由 逆君 于 2022-3-31 11:13 编辑运行环境:
WIN10
涉及工具:
MT管理器、NP管理器、JEB【反正能正常反编译转成java代码来看就好】,模拟器【机型:xiaomi9】
教程类型:
算法分析
是否讲解思路和原理:
是
以下为图文内容:
0x1 前言
看了下攻防区的Android的,是挺少的,然后网上随便搜了点算法逆向的入门题来分析下,不涉及so层,所以难度很低的!
0x2 目的
算法逆向分析,拿到正确的flag
0x3 分析【算法分析】
1.拿到软件后,先打开看下吧,看到就是提示让你输入东西,然后有提示,看是正确还是错误:
2.现在来随便输点字符,看到会提示 “Sorry your flag is wrong” ,假如是老鸟的话,
或者压根不用看这个,直接根据生命周期去找了,这里我就以这个字符去找
3.假如是爆破的话,这种那肯定很简单啦,随便改个判断就能提示正确的了,那就没有意义了,
本次是算法分析,拿到正确的flag,下面用MT打开,搜索上面出现的提示符,看操作:
4.这里不转java也不难看出,输出提示字符前有个判断,判断方法 check 的输出的值,
而这个方法名也是检查的意思,那应该本次的代码分析应该就是在该方法了
5.跳到方法 check 里面看看逻辑,看操作:
6.跳过去后,看着代码貌似有点难度,那不要紧,转成java看就行了,如下:
7.逻辑分析:
(1)看到先是定义了一个数组s,然后check方法应该是开始校验我们输入的数据,
(2)chars 就是我们输入的字符了,先是判断我们输入的字符的长度是否不等于数组s的长度 31,说明输入的字符长度为31
如果输入的字符长度不等于数组s,则直接返回false 【那就会提示“Sorry your flag is wrong”】
(3)假如长度没问题则往下,定义了一个变量i 默认0,for循环,条件则是判断i是否小于数组的长度,
并且判断是否小于我们输入的字符长度
(4)如果上面的循环判断符合条件则执行循环内的判断逻辑——> if this.s != (chars ^ 23) , 正确则false,错误则true
(5)上面不难看出,最后一步的字符形成【this.s = (chars ^ 23)】就是我们想要的答案,下面直接使用python逆向
8.上面分析得出字符形成的关键在于【this.s = (chars ^ 23)】,
而又因为形成的字符都是ASCII码在0-127的,看下面这图就明白了:
9.根据以上分析,下面可以使用python重新编写逻辑逆向,分析也在图中了,如下:
s = [113, 123, 118, 112, 108, 94, 99, 72, 38, 68, 72, 87, 89, 72, 36, 118, 100, 78, 72, 87, 121, 83, 101, 39, 62, 94,
62, 38, 107, 115, 106]
flag = ""
v0 = 0
while v0 < 31:
v1 = 0
while v1 < 127:
if (s == (v1 ^ 23)):
flag += chr(v1)
v1 += 1
v0 += 1
print(flag)# flag{It_1S_@N_3asY_@nDr0)I)1|d}
练手包地址:
不知道来晚了没有 不可多得,支持楼主 感谢楼主 谢谢分享 谢谢分享 感谢楼主 来向大佬学习 感谢楼主 谢谢分享