工具
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)