1. 程式人生 > >Jarvis OJ reverse之androideasy wp

Jarvis OJ reverse之androideasy wp

這是一道我第一次解出的安卓逆向類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)