CTF的一道安卓逆向


 

前幾天打CTF時遇到的一道安卓逆向,這里簡單的寫一下思路

 

  • 首先用jadx打開apk文件,找到simplecheck處(文件名是simplecheck),可以看到基本邏輯就是通過函數a對輸入的內容進行判斷,如果正確就彈出You get it。

 

  • 我們去類a里看一下可以發現這個就是一道簡單的算法

 

  • 判斷的條件就是在這一個循環里,可以看到成功的條件是,而iArr[]為flag :

a[i2]== b[i2] * iArr[i2]* iArr[i2] + c[i2] * iArr[i2] + d[i2] 

a[i2 + 1] == b[i2] * iArr[i2 + 1] * iArr[i2 + 1] + c[i2] * iArr[i2 + 1] + d[i2]

 1 int i2 = 0;
 2 while (i2 < c.length) 
 3 {
 4     if (a[i2] != (((b[i2] * iArr[i2]) * iArr[i2]) + (c[i2] * iArr[i2])) + d[i2] || a[i2 + 1] != (((b[i2] * iArr[i2 + 1]) * iArr[i2 + 1]) + (c[i2] * iArr[i2 + 1])) + d[i2]) 
 5     {
 6         return false;
 7     }
 8     i2++;
 9 }
10 return true;

 

 

  • 用python進行爆破

a.length指出flag的長度為35個,並且第一個值賦值為0,所以第一個循環從1到34。並且iArr[]里是byte,java中byte的范圍從-128到127,所以第二個循環是0到127(ASCII從0開始)

1 int[] iArr = new int[a.length]; 
2 iArr[0] = 0;

 

判斷條件進行變化,使iArr變成一個變化值f,所以判斷條件變為:

(a[m] == b[m-1] * f * f + c[m-1] * f + d[m-1]) 
(a[m] == b[m] * f * f + c[m] * f + d[m])

 

最后的爆破程序是

 1 a= [0, 146527998, 205327308, 94243885, 138810487, 408218567, 77866117, 71548549, 563255818, 559010506, 449018203, 576200653, 307283021, 467607947, 314806739, 341420795, 341420795, 469998524, 417733494, 342206934, 392460324, 382290309, 185532945, 364788505, 210058699, 198137551, 360748557, 440064477, 319861317, 676258995, 389214123, 829768461, 534844356, 427514172, 864054312]
 2 b= [13710, 46393, 49151, 36900, 59564, 35883, 3517, 52957, 1509, 61207, 63274, 27694, 20932, 37997, 22069, 8438, 33995, 53298, 16908, 30902, 64602, 64028, 29629, 26537, 12026, 31610, 48639, 19968, 45654, 51972, 64956, 45293, 64752, 37108]
 3 c= [38129, 57355, 22538, 47767, 8940, 4975, 27050, 56102, 21796, 41174, 63445, 53454, 28762, 59215, 16407, 64340, 37644, 59896, 41276, 25896, 27501, 38944, 37039, 38213, 61842, 43497, 9221, 9879, 14436, 60468, 19926, 47198, 8406, 64666]
 4 d= [0, -341994984, -370404060, -257581614, -494024809, -135267265, 54930974, -155841406, 540422378, -107286502, -128056922, 265261633, 275964257, 119059597, 202392013, 283676377, 126284124, -68971076, 261217574, 197555158, -12893337, -10293675, 93868075, 121661845, 167461231, 123220255, 221507, 258914772, 180963987, 107841171, 41609001, 276531381, 169983906, 276158562]
 5  
 6 flag="";
 7 for m in range(1,34):      
 8     for f in range(0,127):     
 9         if (a[m] == b[m] * f * f + c[m] * f + d[m]) | (a[m] == b[m-1] * f * f + c[m-1] * f + d[m-1]) :
10             flag+=chr(f)
11             break
12         else:
13             pass
14 print(flag+"}")

 

  • 結果為

 

Simplecheck.apk

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM