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,不然参数个数有问题,原因不明。
可以看到就是字符串每位-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}