工具
JEB+IDA+夜神模拟器
思路展开
1.安装应用,观察验证
输入一段字符,点击Login,错误提示just keep trying,有点击事件,故从点击事件入手
2.JEB打开,观察函数,分析算法
public void onClick(View arg8) {
new String(" ");
String v0 = this.a.b.getText().toString(); //v0是输入字符
Log.v("EditText", this.a.b.getText().toString());
new String("");
int v1 = this.a.processObjectArrayFromNative(v0); //两个函数对输入字符处理,但当我们点进去,发现函数为空
int v2 = this.a.IsCorrect(v0);
v0 = String.valueOf(this.a.d + v1) + " "; //处理过的v1+this.a.d,函数不知道,所以v1不知道,this.a.d=0x1BEBE
try {
MessageDigest v1_1 = MessageDigest.getInstance("MD5");//对每个字符md5加密
v1_1.update(v0.getBytes());
byte[] v1_2 = v1_1.digest();
StringBuffer v3 = new StringBuffer();
int v0_2;
for(v0_2 = 0; v0_2 < v1_2.length; ++v0_2) {
v3.append(Integer.toString((v1_2[v0_2] & 0xFF) + 0x100, 16).substring(1)); //对每个字符先取低八位,再加0x100,接着字符转成16进制,再从索引为1开始取,其实我们对字符没有操作,只是转成16进制
}
if(v2 == 1 && this.a.e != "unknown") {
this.a.c.setText("Sharif_CTF(" + v3.toString() + ")");//关键比较,将16进制形式作为flag输出
}
if(v2 == 1 && this.a.e == "unknown") {
this.a.c.setText("Just keep Trying :-)");
}
if(v2 == 0) {
this.a.c.setText("Just keep Trying :-)");
}
return;
}
catch(NoSuchAlgorithmException v0_1) {
v0_1.printStackTrace();
return;
}
}
分析了一圈,发现是将我们的输入先经过IsCorrect判断,再经过processObjectArrayFromNative处理的值,md5加密,再以16进制输出
3.改apk后缀为zip,解压打开,找到so文件,IDA分析两个关键函数
发现两个函数
点开IsCorrect函数(这个函数在上面分析过,是用来判断输入是否正确)发现关键比较,按r转字符串
输入 ef57f3fe3cf603c03890ee588878c0ec
得到flag
Sharif_CTF(833489ef285e6fa80690099efc5d9c9d)