CTF 安卓加解密

题目:
张三听说AES算法很安全,他不想被别人发现他的flag,于是将其加密处理后写到了安卓应用中。并且他从未公开题目的源码,你能从apk附件中破解他想隐藏的flag是什么吗?

附件 : apk

题解:

首先下载安卓反编译工具对apk进行反编译,https://github.com/skylot/jadx
拿到反编译后的代码,根据其AES加密规则进行对应的解密。

public class MainActivity extends AppCompatActivity {

    String enc = "bKhM9b9mSM2Xff4XgzzrYUXhKwfBxzUd30bdW3sOxpClsxmuVh04Ny7VAQhbjKui????";
    String key = "yuNttCSojTyxZodsxxxxxxx";
    private Cipher cipher;

    /* JADX INFO: Access modifiers changed from: protected */
    @Override
    // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("WuHengCTF", "Try this awesome tool to decompile apk\nhttps://github.com/skylot/jadx");
        final EditText editText = (EditText) findViewById(R.id.editText);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() { // from class: com.wuhengctf.wuhengdroid1.MainActivity.1
            @Override // android.view.View.OnClickListener
            public void onClick(View view) {
                try {
                    String s = editText.getText().toString();
                    String e1 = Decrypt(s, key);
                    Log.e("hsk -- > ", e1);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                String s = editText.getText().toString();
                if (MainActivity.this.verify(s)) {
                    Toast.makeText(MainActivity.this.getApplicationContext(), "yep", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this.getApplicationContext(), "nope", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    // flag{xxxxxx}
    // WHCTF{XXX}


    boolean verify(String k) {
        try {
            cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(1, new SecretKeySpec(this.key.getBytes(), "AES"), new IvParameterSpec(new byte[16]));
            byte[] ciphertext = cipher.doFinal(k.getBytes(StandardCharsets.UTF_8));
            String encode = Base64.encodeToString(ciphertext, 2);
            Log.e("WuHengCTF", encode);
            return this.enc.equals(encode);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }



    // 解密
    public String Decrypt(String sSrc, String sKey) throws Exception {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sKey.getBytes(), "AES"),new IvParameterSpec(new byte[16]));
            byte[] encrypted1 = Base64.decode(sSrc, 2);
            try {
//                byte[] original = cipher.doFinal(sSrc.getBytes(StandardCharsets.UTF_8));
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original, StandardCharsets.UTF_8);
                Log.e("解密后", originalString);
                return originalString;
            } catch (Exception e) {
                System.out.println(e.toString());
                return null;
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
            return null;
        }
    }




}

最后通过解密得到flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值