【CTF Reverse】XCTF GFSJ1092 easyEZbaby_app Writeup(Android+逆向工程+Java)

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}

声明

本博客上发布的所有关于网络攻防技术的文章,仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行,并且严格遵守了相关法律法规

博主坚决反对任何形式的非法黑客行为,包括但不限于未经授权的访问、攻击或破坏他人的计算机系统。博主强烈建议每位读者在学习网络攻防技术时,必须遵守法律法规不得用于任何非法目的。对于因使用这些技术而导致的任何后果,博主不承担任何责任

首先,我们需要分析题目所提供的代码: ```php <?php error_reporting(0); if ($_FILES["upload"]["error"] > 0) { echo "Error: " . $_FILES["upload"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["upload"]["name"] . "<br />"; echo "Type: " . $_FILES["upload"]["type"] . "<br />"; echo "Size: " . ($_FILES["upload"]["size"] / 1024) . " Kb<br />"; move_uploaded_file($_FILES["upload"]["tmp_name"], "upload/" . $_FILES["upload"]["name"]); echo "Stored in: " . "upload/" . $_FILES["upload"]["name"]; } ?> ``` 从上述代码中我们可以发现,这是一个文件上传的代码,该代码运行后会将用户上传的文件存储到 `upload` 目录下。 但是,该代码没有对上传的文件类型进行限制,这意味着我们可以上传任何类型的文件,甚至是一些恶意的文件。我们可以尝试上传一些常见的恶意文件,比如 `webshell`。 我们可以在本地创建一个 `webshell.php` 文件,然后上传到服务器上的 `upload` 目录。上传完成后,我们可以访问 `http://xxx.xxx.xxx.xxx/upload/webshell.php` 来执行我们上传的 `webshell`。 最后,我们需要注意的是,该上传脚本没有做任何安全性检查,这意味着我们可以上传任意大小的文件,这可能会影响服务器的性能,甚至导致服务器崩溃。因此,在实际应用中,我们应该对上传的文件大小进行限制,同时对上传的文件类型进行检查,从而确保服务器的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值