攻防世界
基础android
用misc方法解题了
- 将apk文件放入
010editor
中,发现文件头是50 4B 03 04是zip文件,修改后缀,解压 - 在assets文件夹下发现
time_2.zip
,放入010editor
,文件头是FF D8 FF,jpg文件,修改后缀,打开后是一张图片flag{08067-wlecome}
android 2.0
- 将apk文件放入
jadx
中,源代码里面找到MainActiviy
,找到关键部分函数
- 这段代码的功能:
这段代码实现了一个简单的 Android 应用,它有一个按钮、一个文本框和一个显示结果的文本。
用户在文本框(EditText)里输入一个字符串(可能是密码),
然后点击按钮时,代码会调用一个名为 JNI.getResult(str) 的本地方法来判断密码是否正确
如果 JNI.getResult(str) 返回 0,界面会显示 “Wrong”
如果 JNI.getResult(str) 返回 1,界面会显示 “Great”
点进JNI
关键部分是 JNI.getResult(str):
JNI.getResult(str) 是一个 本地方法,也就是说,它的实现并不在 Java 代码里,而是在 C/C++ 代码中,并且通过 JNI(Java Native Interface)被调用。
这意味着需要分析那个本地的.so文件
,找出这个getResult 方法的实现
2. 修改后缀,将.apk改成.zip,解压后找到.so文件,把libNative.so
用IDA
打开,找到几个关键函数
考点:算法逆向
3.
- 分析
First
函数
还原:先异或0x80,再除以2
1 | def First(): |
- 分析
Second
函数
直接异或还原
1 | def second(): |
Third
同理
note如果v6=a5就执行异或操作,所以v6=a5
1 | def third(): |
- 由
Init
函数还原flag - Init函数是将输入的长度为15的字符串,每三个为一组,得到三组字符串(即刚刚解出的三组数据)
1 | def decode(): |
flag{sosorryla}
APK逆向
- 打开apk文件,用
jadx
打开,找到关键MainActiivty
,
注意到edit_sn
和edit_userName
,找到edit_userName = "Tenshine"
, - 在
CheckSN
中看到代码逻辑
md5加密,转为hex字符,for循环注意i+=2 - exp
1 | import hashlib |
flag为
bc72f242a6af3857a
app1
- 用
jadx
打开,MainAvtivity
里面发现有个versionCode
和versionName
,在BuildConfig
里面看到关键信息 - 将apk在模拟器上运行,会发现随便输入会弹出“再接再厉,加油~”,不输入会弹出“”年轻人不要耍小聪明噢”,结合代码梳理出逻辑:
先检查 inputString 是否满足 versionCode.charAt(i) ^ versionName 规则
再检查长度是否相等
两者同时满足,显示 “恭喜开启闯关之门!”
1 | versionName="X<cP[?PHNB<P?aj" |
flag为
W3l_T0_GAM3_0ne