DDCTF2018安卓部分WriteUp

0x0 前言

  感覺自己還是太菜了,還靜不下心去學習,可能這就是自己這麼菜的原因吧。七天的時間零零散散的做了三個安卓題,簡單寫一下思路。題目及部分解題腳本https://pan.baidu.com/s/1MpnW_st_VnRRUJx6rHqZOA

0x1 RSA

  剛看到題目還以爲程序實現了RSA加密,因此找RSA加密算法找了好久。後來才發現程序經過運算生成一個大數,然後對輸入進行取模,如果能整除則正確。

  本題目的JAVA代碼比較簡單,將輸入的字符串傳入jni層的stringFromJNI函數,如果stringFromJNI函數的返回值爲true則顯示Correct.


  將so文件拖入IDA,發現主要處理邏輯爲__aeabi_wind_cpp_prj(int a1)函數,因此我們將研究重點放到__aeabi_wind_cpp_prj函數中。

  該函數首先判斷輸入長度是否爲31位,然後將輸入的每一位與key的每一位進行異或處理。


  這一塊主要是判斷輸入異或後的結果前十位與十一到二十位、二十一到三十位、三十一位是否相等,所以輸入的字符只看前十位即可,後面的與前面的相等。下面又將前十位與後面分隔開,將前十位轉成long long 型。

  程序下面做了一系列的運算,最後得到一個大數5889412424631952987

  然後將大數和上面被轉成long long的輸入做取模運算,判斷模是否爲0,既5889412424631952987%s==0?這地方有點問題的是ida看到的ulddivmod函數裏面的邏輯是返回a1/a2的結果。

  因此我們只需將5889412424631952987做大數分解,求他的兩個因子,然後做異或即可。我的腳本寫的比較亂,是去爆破輸入,只可做參考。

0x2 Hello Baby Dex

 

  程序關於flag的邏輯是相當簡單了...可能這就是叫baby dex的原因吧..只是對輸入與程序的拼接的字符串做了個equals比較

 

  不過app做了簽名的校驗與debug的檢測,所以如果我們動態調試的話可能會有些麻煩。但是仔細看一下前面flag比較的代碼,我們可以發現equals函數是我們的輸入調用的,把程序計算好的flag作爲參數做對比,所以我們可以使用xposed去hook一下equals函數獲取參數來獲取flag。

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if (!loadPackageParam.packageName.equals("cn.chaitin.geektan.crackme")){
            return;
        }
        XposedHelpers.findAndHookMethod("java.lang.String", loadPackageParam.classLoader, "equals", Object.class, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                if(param.args[0].toString().contains("DDCTF")){
                    XposedBridge.log("before"+param.args[0]);
                }

            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {

            }
        });
    }

  0x3 Diffie-Hellman

    這個題感覺是在第一題上面改的,java層沒有變化,改動了一些jni中的代碼,如果看懂了第一題第三題也就沒什麼問題了。

  大致流程是將你的輸入作爲2的冪數,與v10進行取模,將得到的模與mod_residual進行比較 既(2^input%v10)==mod_residual ?

  因爲我對於密碼學沒有過深入的瞭解,所以只能採用了爆破的方法,希望有好辦法的大佬能給予指導~

mod_res=0x2BF5B02AC9500
mod=0x1E75BF5AB47900
for i in range(150000,550000):
    if (2**i) %mod==mod_res:
        print(i)
        break
print("stop..")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章