忙着考试、做各种东西、拖着拖着就半个月了(ノಠ益ಠ)ノ彡┻━┻
这篇是全国大学生信息安全竞赛初赛珍贵资料的writeup
第一次参加这种比赛起码还是做出了一道200分的题,然而还是自己太弱
可惜一堆咸鱼忙着期末考试,最终没能进到复赛(不能去上海玩啊擦擦擦擦)
好了,进入正题吧= =
珍贵资料
题目链接:http://www.ichunqiu.com/racing/54391
压缩包解压出来两个文件
unknown unknown2
通过工具易知(例如ida),unknown2是apk文件, 而unknown刚开始我并不知道是什么
通过文件头可以Google出来

这是一个android的备份文件
apk安卓类的逆向,先apktool反编译下,装上虚拟机或真机调试

直接点击登录会出现提示

所以就是需要找出password是什么
可以定位代码到LoginActivity.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| private SharedPreferences sp;
public void onClick(View paramAnonymousView) { LoginActivity.this.userNameValue = LoginActivity.this.userName.getText().toString(); LoginActivity.this.passwordValue = LoginActivity.this.encode(LoginActivity.this.password.getText().toString()); if ((LoginActivity.this.userNameValue.equals(LoginActivity.this.sp.getString("USER_NAME", ""))) && (LoginActivity.this.passwordValue.equals(LoginActivity.this.sp.getString("PASSWORD", "")))) { Toast.makeText(LoginActivity.this, "登录成功", 0).show(); paramAnonymousView = new Intent(LoginActivity.this, LogoActivity.class); LoginActivity.this.startActivity(paramAnonymousView); return; } Toast.makeText(LoginActivity.this, "登录失败", 1).show(); }
|
输入的用户密码跟存在sharepreference里的账户密码做比较
密码的加密算法如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public static String Encryption(String paramString) { StringBuilder localStringBuilder = new StringBuilder(); if ((paramString == null) || (paramString.length() < 1)) { System.out.println("you Input nothing."); return null; } paramString = paramString.toLowerCase(); int m = paramString.length(); int k = 0; for (;;) { if (k >= m) { return localStringBuilder.toString(); } int j = "ijklmstuvwxyz0123abcdenopqrfgh456789".indexOf(paramString.charAt(k)); int i = j; if (j == LEN - 1) { i = -1; } j = i; if (i == LEN - 2) { j = -2; } i = j; if (j == LEN - 3) { i = -3; } localStringBuilder.append("ijklmstuvwxyz0123abcdenopqrfgh456789".charAt(i + 3)); k += 1; } }
|
对于安卓备份文件恢复
用adb restore file命令,在设备上点击恢复,不需要输入密码
adb shell在/data/data/com.example.login/shared_prefs中可以找到存储用户信息的xml文件userInfo.xml
1 2 3 4 5
| <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="PASSWORD">dudqlvqrero1</string> <string name="USER_NAME">user</string> </map>
|
可以看到加密后的password = dudqlvqrero1
针对加密算法,写出解密程序(其实那就是一个偏移3位的凯撒加密)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
password = 'dudqlvqrero1' str1 = 'ijklmstuvwxyz0123abcdenopqrfgh456789' LEN = len(str1) ans = ''
for c in password: i = str1.find(c) i -= 3 if i == -3: j = LEN - 3 elif i == -2: j = LEN -2 elif i == -1: j = LEN - 1 else: j = i ans += str1[j]
print(ans)
|
得出 flag = amanisnobody