XCTF-phoenix100

前期工作

查壳无壳,界面是普通的输入flag点击验证

逆向分析

文件结构只有一个MainActively,查看MainActively代码

public class MainActivity extends AppCompatActivity {
    EditText etFlag;

    public native String encrypt(String str);

    public native String getFlag();

    static {
        System.loadLibrary("phcm");
    }

    /* access modifiers changed from: protected */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView((int) R.layout.activity_main);
        this.etFlag = (EditText) findViewById(R.id.flag_edit);
    }

    public void onGoClick(View v) {
        if (getSecret(getFlag()).equals(getSecret(encrypt(this.etFlag.getText().toString())))) {
            Toast.makeText(this, "Success", 1).show();
        } else {
            Toast.makeText(this, "Failed", 1).show();
        }
    }

    public String getSecret(String string) {
        try {
            byte[] hash = MessageDigest.getInstance(encrypt("KE3TLNE6M43EK4GM34LKMLETG").substring(5, 8)).digest(string.getBytes("UTF-8"));
            if (hash != null) {
                StringBuilder hex = new StringBuilder(hash.length * 2);
                for (byte b : hash) {
                    if ((b & 255) < 16) {
                        hex.append("0");
                    }
                    hex.append(Integer.toHexString(b & 255));
                }
                return hex.toString();
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e2) {
            e2.printStackTrace();
        }
        return null;
    }
}

有两个native方法,getSecret方法中也调用了其中一个,所以还是先看看这两个方法吧。

查看字符串,没找到什么可疑的字符串,很简单就找到了两个方法。先看看encrypt吧。

昨天看到说不用导入jni了,直接按y改结构就可以了。

encrypt代码,这里要x86的so,不然参数个数有问题,原因不明。

image-20200728095501594

可以看到就是字符串每位-1。

回头再看getSecret方法。

MessageDigest.getInstance(encrypt("KE3TLNE6M43EK4GM34LKMLETG").substring(5, 8)).digest(string.getBytes("UTF-8"));

这一句应该就是MD5加密了。

因为getFlag方法没有参数只有返回值,直接Hook onGoClick方法查看getFlag的返回值

ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|

既然两边都经过了getSecret函数,那不要管这个函数,只要让两边的字符串一样即可。

脚本简单就不放了

flag

flag{Ar3_y0u_go1nG_70_scarborough_Fair}

posted @ 2020-07-28 13:17  S1mba  阅读(161)  评论(0编辑  收藏  举报