ali2015, android cake 水題

來源:互聯網
上載者:User

標籤:

參加了ali2015 ,但是時間的關係,僅僅弄了50pt的題。

結束了發現,隊友真是給力。挺到49名了,差一點到前30就決賽了。 哈哈。

不過逆向之後的成就感還是很強的。

話不多說。上思路:

思路: 沒有.so的apk是最好破解的。不擇手段的使用工具,綜合分析出演算法。
    jd-gui、smali2java、drEvent、androidKiller等。
1、反編譯後,使用jd-gui查看,發現反編譯的不充分。使用smali2java,發現根本沒有反編譯出來。

jd的效果:

smali2java的效果

2、那麼,就目前我的能力而言,只能結合jd,還有自己的cfg工具,進行manual分析了。

3、分析的過程比較繁瑣,直接上整理後的代碼。
public void check(String paramString)  {    int i = 0;    if (paramString.length() != 16) {      throw new RuntimeException();    }    try    {      String str2 = get?ey();      str1 = str2;    }    catch (Exception localException1)    {        String str1 = getKey();        System.arraycopy(str1, 0, paramString, 5, 5);    }    arrayOfInt = new int[16];    arrayOfInt[0] = 0;    arrayOfInt[12] = 14;    arrayOfInt[10] = 7;    arrayOfInt[14] = 15;    arrayOfInt[15] = 42;    try    {        arrayOfInt[1] = 3;        arrayOfInt[5] = 5;        System.out.println();    }    catch    {       arrayOfInt[5] = 37;       arrayOfInt[1] = 85;    }         arrayOfInt[6] = 15;    arrayOfInt[2] = 13;    arrayOfInt[3] = 19;    arrayOfInt[11] = 68;    arrayOfInt[4] = 85;    arrayOfInt[13] = 5;    arrayOfInt[9] = 7;    arrayOfInt[7] = 78;    arrayOfInt[8] = 22;    for(i=0 ; i < paramString.length() ;i++)    {        if ( (0xFF & arrayOfInt[i]) != (0xFF & (paramString.charAt(i) ^ str1.charAt(i % str1.length()) ) ))           throw new RuntimeException();    }  }    public String getKey()  {    return "bobbydylan";  }

4、關鍵程式就是check,那麼以上代碼就能大概分析出意圖了。有個地方需要注意,就是使用的getkey不是當前的getkey,是另外一個檔案的getkey。
我開始也在這裡卡了一下,後來發現了字元有點不一樣,還以為是看錯了,原來真的就是不一樣了。

5、那麼,整個密碼編譯演算法的過程就是。
[
1.擷取getkey加密字串str1[];
2.指定位置賦值的arrayint[];
3.關鍵的判斷(0xFF & arrayOfInt[i]) != (0xFF & (paramString.charAt(i) ^ str1.charAt(i % str1.length()) ),這個要假才行。
那麼逆向過來,就是param[i] = ar ^ intStr[ i%len(str1)] ) & 0xff.
]
6、接著寫指令碼逆向。
param = []#'bloq,av"wie +lgvN'#str1 = 'bobbydylan'str1 = 'bobdylan'#intStr = [98, 111, 98, 98, 121, 100, 121, 108, 97, 110]intStr = [98, 111, 98, 100, 121, 108, 97, 110]arrayint = [0, 3, 13, 19, 85, 5, 15, 78, 22, 7, 7, 68, 14, 5, 15, 42]i=0for ar in arrayint:    param.append( ( ar ^ intStr[ i%len(str1)] ) & 0xff )      i +=1print ''.join(map(chr,param))

7、最終得到答案: blow,in the winD


總結下來,還是很簡單的。
關鍵是:1、有耐心分析真正的加密過程;2、細心觀察函數。
就是小cake。

ali2015, android cake 水題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.