摘要:第二題返老還童拿到之后丟進,發現只有,代碼,沒有。仔細觀察發現,以上坐標可以對應坐標系中的一個九宮格。有點腦洞,把九個坐標編好數字,然后按照坐標給出的順序寫數字就是答案。
Mobile 第二題:返老還童(1000pt)
拿到apk之后丟進JEB,發現只有.class,java代碼,沒有so。整個apk的class文件結構如下:
a.a.a com.reverse.daydayup.a com.reverse.daydayup.b com.reverse.daydayup.MainActivity
閱讀MainActivity,發現頁面下方是一個WebView,用于展示結果的區域,MainActivity中有關于加載Google WebView的代碼,文件中還有一個check_flag.html,打開看好多JS,一臉懵逼,不過目標還是轉向java代碼。
定位到a.a.a,發現兩個函數a和b,分析之發現第一個函數a要求了flag格式為xxxx-xxxx-xxxx-xxxx,也就是以“-”進行split之后必須是四個字串,同時每個字串長度都為4,字串中所有字符都必須是字母和數字。經過我簡單修改替換后的代碼如下(修改函數返回值為boolean,便于后續破解):
public static boolean a(String paraString) { // int v6 = 4; Check.a = 0; Check.b = 0; // MainActivity.b.getSettings(). //setUserAgentString(MainActivity.b.getSettings(). //getUserAgentString() + ";" + Check.a + ";" + Check.b); // 以“-”分割字符串 String[] subString = paraString.split("-"); // 分割后必須產生4個子串:即格式為xxxx-xxxx-xxxx-xxxx if(subString.length == 4) { int i = 0; while(i < subString.length) { // 檢查四個字串,要求長度也為4,并且只能為字母或數字 if(subString[i].length() == 4) { int k; for(k = 0; k < subString[i].length(); ++k) { if( !(subString[i].charAt(k) >= "0" && subString[i].charAt(k) <= "9") && !(subString[i].charAt(k) >= "A" && subString[i].charAt(k) <= "Z") && !(subString[i].charAt(k) >= "a" && subString[i].charAt(k) <= "z")) { return false; } } ++i; } else { return false; } } // 滿足條件,進入b方法 return Check.b(paraString); } return false; }
以上條件滿足后進入b函數,b函數有很多遞推關系,具體關系如代碼注釋所示,同樣修改函數返回值為boolean:
public static boolean b(String paraString) { // int v8 = 3; // int v6 = 2; String[] subString = paraString.split("-"); char[] subString0 = subString[0].toCharArray(); char[] subString1 = subString[1].toCharArray(); char[] subString2 = subString[2].toCharArray(); char[] subString3 = subString[3].toCharArray(); // (a,b)意思是第a部分的第b個字符 // (1,1)==(4,2)-3 // (1,4)==(4,3)| 1(最低位變為1) // (4,3)的ASCII是奇數 if(subString0[0] == subString3[1] - 3 && subString0[3] == (((char)(subString3[2] | 1))) && subString3[2] % 2 != 1) { // a = (4,4)^ 55 Check.a = subString3[3] ^ 55; // (4,3)==(1,3)+ 8 // (4,1)==(1,1)- 2 // (4,2)==(1,4)^ 18 // (1,2)* 2 ==(1,3)-8 // (4,4)==(1,3) if(subString3[2] == subString0[2] + subString0.length * 2 && subString3[0] == subString0[0] - subString0.length / 2 && subString3[1] == (((char)(subString0[3] ^ 18))) && subString0[1] * 2 == subString0[2] - 8 && subString3[3] == subString0[2]) { // (2,2)+12==(2,4) // (3,2)* 2 == (2,4)- 11 if(subString.length * 3 + subString1[1] == subString1[3] && subString2[1] * 2 == subString1[3] - 11) { // b = (2,3)- 117 Check.b = subString1[2] - subString2.length ^ 113; // (2,1)+(3,1)== 187 // (2,1)+(3,4)== 210 // (2,4)^(2,3)== 47 // (2,1)^(2,2)== 15 // (3,3)^(2,2)== 5 if(subString1[0] + subString2[0] == 187 && subString1[0] + subString2[3] == 210 && (subString1[3] ^ subString1[2]) == 47 && (subString1[0] ^ subString1[1]) == 15 && (subString2[2] ^ subString1[1]) == 5 && // (4,4)^ 55 >(2,3)- 117 // (4,4)^ 55 < 100 Check.a > Check.b && Check.a < 100) { return true; // MainActivity.b.getSettings() //.setUserAgentString(MainActivity.b.getSettings() //.getUserAgentString() + ";" + Check.a + ";" + Check.b); } } } } return false; }
分析所有限制條件發現,只需要遍歷(2,1)和(4,3)的所有可能(ASCII碼范圍從字符0到字符z)再推算出其他字符,滿足條件的就是答案,將以上代碼放入Eclipse,編寫解題代碼如下:
/** * 主函數 ShellCode * @param args */ public static void main(String[] args) { for(char c21="0";c21<="z";c21++) { for(char c43="0";c43<="z";c43++) { StringBuilder result = new StringBuilder(""); char c13=(char) (c43-8); char c12=(char) ((c13-8)/2); char c14=(char) (c43 | 1); char c22=(char) (c21^15); char c24=(char) (c22+12); char c23=(char) (c24^47); char c31=(char) (187-c21); char c32=(char) ((c24-11)/2); char c33=(char) (c22^5); char c34=(char) (210-c21); char c42=(char) (c14^18); char c11=(char) (c42-3); char c41=(char) (c11-2); char c44=c13; result.append(c11); result.append(c12); result.append(c13); result.append(c14); result.append("-"); result.append(c21); result.append(c22); result.append(c23); result.append(c24); result.append("-"); result.append(c31); result.append(c32); result.append(c33); result.append(c34); result.append("-"); result.append(c41); result.append(c42); result.append(c43); result.append(c44); if (a(result.toString())==true) { System.out.println("OK:"+result); } } } }
運行程序,程序輸出:
OK:d2lu-bmVy-Y7hp-bgtl OK:h4py-bmVy-Y7hp-fkxp OK:d2lu-dkXw-W6nn-bgtl OK:h4py-dkXw-W6nn-fkxp OK:d2lu-fiZu-U5ll-bgtl OK:h4py-fiZu-U5ll-fkxp OK:d2lu-naBm-M1dd-bgtl
按順序提交測試,剛好第一個就是flag
XCTF{d2lu-bmVy-Y7hp-bgtl}第三題 神秘的txt(1000pt)
題目是一個txt文檔:
XCTF{(37,99)(19,99)(19,108)(28,99)(28,108)(37,108)(37,117)(28,117)(19,117)}
原本第一個37 99中間的逗號是亂碼,猜測是中文逗號,編碼問題。仔細觀察發現,以上坐標可以對應坐標系中的一個“九宮格”。有點腦洞,把九個坐標編好數字,然后按照坐標給出的順序寫數字就是答案。
一開始嘗試的是數學坐標系:
(19,117)(28,117)(37,117) (19,108)(28,108)(37,108) (19,99)(28,99)(37,99)
7 8 9 4 5 6 1 2 3
嘗試答案:
XCTF{314256987}
答案錯誤,后來想,可能是按照二維數組的排列順序,數字的順序我們就堅信是按照電腦鍵盤小鍵盤的排列順序了,于是編寫程序:
#includeint main(int argc, char *argv[]) { char array[118][118]; for(int i=0;i<118;i++) { for(int j=0;j<118;j++) { array[i][j]=" "; } } array[37][99]="1"; array[19][99]="7"; array[19][108]="8"; array[28][99]="4"; array[28][108]="5"; array[37][108]="2"; array[37][117]="3"; array[28][117]="6"; array[19][117]="9"; for(int i=0;i<118;i++) { for(int j=0;j<118;j++) { printf("%c",array[i][j]); } } return 0; }
程序輸出:
7 8 9 4 5 6 1 2 3
將上述程序變量定義的順序寫入flag,即為答案:
XCTF{178452369}
提交,答案正確。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11326.html
摘要:摘要今年的先知白帽大會,與會者將能夠親身感受到非常多有趣的技術議題,如在國際賽事中屢奪佳績的團隊,其隊長將親臨現場,分享穿針引線般的漏洞利用藝術。從數據視角探索安全威脅阿里云安全工程師議題解讀本議題討論了數據為安全人員思維方式帶來的變化。 摘要: 今年的先知白帽大會,與會者將能夠親身感受到非常多有趣的技術議題,如HITCON在國際賽事中屢奪佳績的CTF團隊,其隊長Orange將親臨現場...
閱讀 1258·2021-11-19 09:40
閱讀 3117·2021-11-02 14:47
閱讀 3050·2021-10-11 10:58
閱讀 3216·2019-08-30 15:54
閱讀 2666·2019-08-30 12:50
閱讀 1721·2019-08-29 16:54
閱讀 462·2019-08-29 15:38
閱讀 1237·2019-08-29 15:19