安卓逆向 刷题笔记

818 词

攻防世界

基础android

用misc方法解题了

  1. 将apk文件放入010editor中,发现文件头是50 4B 03 04是zip文件,修改后缀,解压
    解压
  2. 在assets文件夹下发现time_2.zip,放入010editor,文件头是FF D8 FF,jpg文件,修改后缀,打开后是一张图片flag

    flag{08067-wlecome}

android 2.0

  1. 将apk文件放入jadx中,源代码里面找到MainActiviy,找到关键部分函数
    mainactivity
  • 这段代码的功能:

这段代码实现了一个简单的 Android 应用,它有一个按钮、一个文本框和一个显示结果的文本。
用户在文本框(EditText)里输入一个字符串(可能是密码),
然后点击按钮时,代码会调用一个名为 JNI.getResult(str) 的本地方法来判断密码是否正确

如果 JNI.getResult(str) 返回 0,界面会显示 “Wrong”
如果 JNI.getResult(str) 返回 1,界面会显示 “Great”

点进JNI
mainactivity2

关键部分是 JNI.getResult(str):
JNI.getResult(str) 是一个 本地方法,也就是说,它的实现并不在 Java 代码里,而是在 C/C++ 代码中,并且通过 JNI(Java Native Interface)被调用。

这意味着需要分析那个本地的.so文件,找出这个getResult 方法的实现
2. 修改后缀,将.apk改成.zip,解压后找到.so文件,把libNative.soIDA打开,找到几个关键函数
.so
考点:算法逆向
3.

  • 分析First函数
    First
    还原:先异或0x80,再除以2
1
2
3
4
5
6
7
8
9
def First():
enc="LN^dl"
dec=""
for i in range(0,4):
dec+=(chr(int((ord(enc[i])^0x80)/2)))
dec+='l'
print(dec)
First()
#fgorl
  • 分析Second函数
    second
    直接异或还原
1
2
3
4
5
6
7
8
9
10
11
def second():
a5=[ord(' '),ord('5'),ord('-'),0x16,ord('a')]
a1=[ord('L'),ord('N'),ord('^'),ord('d'),ord('l')]
s1=""
for i in range(0,4):
x=a5[i]^a1[i]
s1+=chr(x)
s1+='a'
print(s1)
second()
#l{sra
  • Third同理
    third
    note如果v6=a5就执行异或操作,所以v6=a5
1
2
3
4
5
6
7
8
9
10
11
12
 def third():
a5 = [ord(' '), ord('5'), ord('-'), 0x16, ord('a')]
dec = [ord('A'), ord('F'), ord('B'), ord('o'), ord('}')]
enc = ""
for i in range(0, 4):
x = a5[i] ^ dec[i]
enc += chr(x)
enc += '}'
print(enc)

third()
#asoy}
  • Init函数还原flag
  • Init函数是将输入的长度为15的字符串,每三个为一组,得到三组字符串(即刚刚解出的三组数据)
1
2
3
4
5
6
7
8
9
10
def decode():
s1="fgorl"
s2="l{sra"
s3="asoy}"
flag=""
for i in range(0,5):
flag+=s1[i]+s2[i]+s3[i]
print(flag)
decode()
#flag{sosorryla}

flag{sosorryla}

APK逆向

  1. 打开apk文件,用jadx打开,找到关键MainActiivty,
    注意到edit_snedit_userName,找到edit_userName = "Tenshine",
  2. CheckSN中看到代码逻辑
    checksn
    md5加密,转为hex字符,for循环注意i+=2
  3. exp
1
2
3
4
5
6
7
8
9
10
import hashlib
str=b"Tenshine"
str1=hashlib.md5(str).hexdigest()
flag=""
for i in range(len(str1)):
if(i%2==0):
flag+=str1[i]

print(flag)
#bc72f242a6af3857a

flag为

bc72f242a6af3857a

app1

  1. jadx打开,MainAvtivity里面发现有个versionCodeversionName,在BuildConfig里面看到关键信息
    buildconfig
  2. 将apk在模拟器上运行,会发现随便输入会弹出“再接再厉,加油~”,不输入会弹出“”年轻人不要耍小聪明噢”,结合代码梳理出逻辑:

先检查 inputString 是否满足 versionCode.charAt(i) ^ versionName 规则
再检查长度是否相等
两者同时满足,显示 “恭喜开启闯关之门!”

1
2
3
4
5
6
7
versionName="X<cP[?PHNB<P?aj"
versionCode=15
flag=""
for i in range(len(versionName)):
flag+=chr(ord(versionName[i])^versionCode)
print(flag)
#W3l_T0_GAM3_0ne

flag为

W3l_T0_GAM3_0ne

app2