Jarvis OJ reverse之androideasy wp
阿新 • • 發佈:2018-11-16
這是一道我第一次解出的安卓逆向類CTF題目,下面記錄並分享一下思路。
一,把檔案下載下來,開啟是一個apk檔案,用jeb反編譯(找到MainAcitivity,然後右鍵Decompile即可)得到java程式碼。
package com.a.sample.androidtest; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View$OnClickListener; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private EditText editText; private byte[] s; public MainActivity() { super(); this.s = new byte[]{113, 123, 118, 112, 108, 94, 99, 72, 38, 68, 72, 87, 89, 72, 36, 118, 100, 78, 72, 87, 121, 83, 101, 39, 62, 94, 62, 38, 107, 115, 106}; } public boolean check() { boolean v2 = false; byte[] v0 = this.editText.getText().toString().getBytes(); if(v0.length == this.s.length) { int v1 = 0; while(v1 < this.s.length) { if(v1 >= v0.length) { break; } if(this.s[v1] == (v0[v1] ^ 23)) { ++v1; continue; } else { return v2; } } v2 = true; } return v2; } protected void onCreate(Bundle arg4) { super.onCreate(arg4); this.setContentView(2130968603); this.editText = this.findViewById(2131427415); this.findViewById(2131427416).setOnClickListener(new View$OnClickListener(this) { public void onClick(View arg4) { if(MainActivity.this.check()) { Toast.makeText(this.val$context, "You got the flag!", 1).show(); } else { Toast.makeText(this.val$context, "Sorry your flag is wrong", 1).show(); } } }); } }
二,分析程式碼。
這裡呼叫了很多安卓類,會給一開始的我造成一些壓力困擾。但我們只關心主要演算法部分就行,onCreate的作用是判定傳給check()的是True還是False,True則得到flag。回到check(),要想返回True,則要執行if內的語句,^是一個異或運算,顯而易見,該部分是說 陣列s裡的每個數值 和v0中的每個數與23進行異或運算後的數值相等。v0就是我們要求的flag的數字表示。通過寫個指令碼逆著來就ok了。
指令碼如下
s=[113, 123, 118, 112, 108, 94, 99, 72, 38, 68, 72, 87, 89, 72, 36, 118, 100, 78, 72, 87, 121, 83, 101, 39, 62, 94, 62, 38, 107, 115, 106] length=len(s) print(length) key=[] flag='' for i in range(length): key.append(s[i]^23) for j in range(length): flag+=chr(key[j]) print(flag)