easyEZbaby_app
究极简单的安卓逆向
解法
得到一个 apk 安装包。
用 jadx 打开,搜索文本 flag,加载所有。
flag 是 obj + obj2,来自用户的用户名和密码。
@Override // android.view.View.OnClickListener
public void onClick(View view) {
String obj = this.username.getText().toString();
String obj2 = this.password.getText().toString();
if (checkUsername(obj) && checkPass(obj2)) {
Toast.makeText(this, "登录成功", 0).show();
Toast.makeText(this, "flag{" + obj + obj2 + "}", 0).show();
return;
}
Toast.makeText(this, "登录失败", 0).show();
}
先分析 checkUsername 方法。str 和 sb 相等时返回 true。
public boolean checkUsername(String str) {
if (str != null) {
try {
if (str.length() != 0 && str != null) {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update("zhishixuebao".getBytes());
String hexString = toHexString(messageDigest.digest(), "");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hexString.length(); i += 2) {
sb.append(hexString.charAt(i));
}
return (sb.toString()).equals(str);
}
return false;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
return false;
}
将 CheckUsername 方法改为输出 sb。
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class CheckUsername {
public static void main(String[] args) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update("zhishixuebao".getBytes());
String hexString = toHexString(messageDigest.digest(), "");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hexString.length(); i += 2) {
sb.append(hexString.charAt(i));
}
System.out.print(sb);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
private static String toHexString(byte[] bArr, String str) {
StringBuilder sb = new StringBuilder();
for (byte b : bArr) {
String hexString = Integer.toHexString(b & 255);
if (hexString.length() == 1) {
sb.append('0');
}
sb.append(hexString);
sb.append(str);
}
return sb.toString();
}
}
输出:
7afc4fcefc616ebd
然后分析 checkPass 方法。str 不为空,长度15,
public boolean checkPass(String str) {
if (str == null) {
return false;
}
char[] charArray = str.toCharArray();
if (charArray.length != 15) {
return false;
}
for (int i = 0; i < charArray.length; i++) {
charArray[i] = (char) ((((255 - i) + 2) - 98) - charArray[i]);
if (charArray[i] != '0' || i >= 15) {
return false;
}
}
return true;
}
经过这句处理后,charArray[i] 变为 ‘0’。
charArray[i] = (char) ((((255 - i) + 2) - 98) - charArray[i]);
将 CheckPass 方法改为输出 str。
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class CheckPass {
public static void main(String[] args) {
char[] charArray = new char[15];
for (int i = 0; i < charArray.length; i++) {
charArray[i] = (char) ((((255 - i) + 2) - 98) - '0');
}
System.out.print(charArray);
}
}
输出:
onmlkjihgfedcba
拼接 obj + obj2 得到 flag。
Toast.makeText(this, "flag{" + obj + obj2 + "}", 0).show();
Flag
flag{7afc4fcefc616ebdonmlkjihgfedcba}
声明
本博客上发布的所有关于网络攻防技术的文章,仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行,并且严格遵守了相关法律法规。
博主坚决反对任何形式的非法黑客行为,包括但不限于未经授权的访问、攻击或破坏他人的计算机系统。博主强烈建议每位读者在学习网络攻防技术时,必须遵守法律法规,不得用于任何非法目的。对于因使用这些技术而导致的任何后果,博主不承担任何责任。