攻防世界misc新手_[攻防世界]mobile新手练习区easy-apk
[攻防世界]mobile新手練習(xí)區(qū)easy-apk
easy-apk最佳Writeup由129師386旅獨(dú)立團(tuán) ? devi1提供
難度系數(shù): 7.0
題目來源: 暫無
題目描述:無
題目場景: 暫無
題目附件: 附件1
反編譯后有用的附件內(nèi)容:
MainActivity.classBase64New.classpackage com.testjava.jack.pingan1;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast;public class MainActivityextends AppCompatActivity {protected void onCreate(Bundle paramBundle){super.onCreate(paramBundle);setContentView(2130968603);((Button)findViewById(2131427446)).setOnClickListener(new View.OnClickListener(){public void onClick(View paramAnonymousView){paramAnonymousView = ((EditText)MainActivity.this.findViewById(2131427445)).getText().toString();if (new Base64New().Base64Encode(paramAnonymousView.getBytes()).equals("5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=")) {Toast.makeText(MainActivity.this, "驗(yàn)證通過!", 1).show();}for (;;){return;Toast.makeText(MainActivity.this, "驗(yàn)證失敗!", 1).show();}}});} }package com.testjava.jack.pingan1;public class Base64New {private static final char[] Base64ByteToStr = { 118, 119, 120, 114, 115, 116, 117, 111, 112, 113, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 121, 122, 48, 49, 50, 80, 81, 82, 83, 84, 75, 76, 77, 78, 79, 90, 97, 98, 99, 100, 85, 86, 87, 88, 89, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 56, 57, 43, 47 };private static final int RANGE = 255;private static byte[] StrToBase64Byte = new byte['?'];public String Base64Encode(byte[] paramArrayOfByte){StringBuilder localStringBuilder = new StringBuilder();for (int i = 0; i <= paramArrayOfByte.length - 1; i += 3){byte[] arrayOfByte = new byte[4];int j = 0;int k = 0;if (k <= 2){if (i + k <= paramArrayOfByte.length - 1) {arrayOfByte[k] = ((byte)(byte)((paramArrayOfByte[(i + k)] & 0xFF) >>> k * 2 + 2 | j));}for (j = (byte)(((paramArrayOfByte[(i + k)] & 0xFF) << (2 - k) * 2 + 2 & 0xFF) >>> 2);; j = 64){k++;break;arrayOfByte[k] = ((byte)j);}}arrayOfByte[3] = ((byte)j);j = 0;if (j <= 3){if (arrayOfByte[j] <= 63) {localStringBuilder.append(Base64ByteToStr[arrayOfByte[j]]);}for (;;){j++;break;localStringBuilder.append('=');}}}return localStringBuilder.toString();} }
解題
拿到附件989ca07c3f90426fa05406e4369901ff.apk,flag一定要反編譯。博主用的ApkIDE進(jìn)行反編譯。先找到入口主類MainActivity,發(fā)現(xiàn)有很明顯的比較函數(shù),字符串是5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=,又看到Base64Encode(paramAnonymousView.getBytes()),立馬進(jìn)行Base64進(jìn)行解碼得到江????!?岠??葓滀,明顯不是flag,仔細(xì)一看是new Base64New().Base64Encode(paramAnonymousView.getBytes()),所以找到Base64New(),果然碼表不一樣。拿到碼表,可根據(jù)新的碼表進(jìn)行計(jì)算。具體如下。
題目:flag->ASCII->base編碼->Unicode編碼->base編碼。
解題:base解碼->Unicode解碼->base解碼->對照ASCII得出flag
代碼的實(shí)現(xiàn)
博主也找了base64相關(guān)的代碼實(shí)現(xiàn),如下。
#查看碼表 tables = [118, 119, 120, 114, 115, 116, 117, 111, 112, 113, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 121, 122, 48, 49, 50, 80, 81, 82, 83, 84, 75, 76, 77, 78, 79, 90, 97, 98, 99, 100, 85, 86, 87, 88, 89, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 56, 57, 43, 47] flag = "" for i in tables:flag += chr(i); print(flag)//輸出的碼表vwxrstuopq34567ABCDEFGHIJyz012PQRSTKLMNOZabcdUVWXYefghijklmn89+/
Golang版本,可編碼表Base64
package mainimport ("encoding/base64""fmt" )const (base64Table = "vwxrstuopq34567ABCDEFGHIJyz012PQRSTKLMNOZabcdUVWXYefghijklmn89+/" )var coder = base64.NewEncoding(base64Table)func base64Encode(src []byte) []byte {return []byte(coder.EncodeToString(src)) }func base64Decode(src []byte) ([]byte, error) {return coder.DecodeString(string(src)) }func main() {str := "5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs="// decode enbyte, err := base64Decode([]byte(str))if err != nil {fmt.Println(err.Error())}fmt.Println(string(enbyte)) }python
#調(diào)用base64模型 import base64table_tmp = [ 118, 119, 120, 114, 115, 116, 117, 111, 112, 113, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 121, 122, 48, 49, 50, 80, 81, 82, 83, 84, 75, 76, 77, 78, 79, 90, 97, 98, 99, 100, 85, 86, 87, 88, 89, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 56, 57, 43, 47 ] table_original = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' table_tmp_str = '' str1 = '5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=' for i in table_tmp:table_tmp_str += chr(i) print(table_tmp_str) print(base64.b64decode(str1.translate(str.maketrans(table_tmp_str, table_original)).encode('utf-8')))#實(shí)現(xiàn)了base64 #來自https://blog.csdn.net/qq_42967398/article/details/101778364# coding:utf-8s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #s = "vwxrstuopq34567ABCDEFGHIJyz012PQRSTKLMNOZabcdUVWXYefghijklmn89+/"def My_base64_encode(inputs):# 將字符串轉(zhuǎn)化為2進(jìn)制bin_str = []for i in inputs:x = str(bin(ord(i))).replace('0b', '')bin_str.append('{:0>8}'.format(x))#print(bin_str)# 輸出的字符串outputs = ""# 不夠三倍數(shù),需補(bǔ)齊的次數(shù)nums = 0while bin_str:#每次取三個(gè)字符的二進(jìn)制temp_list = bin_str[:3]if(len(temp_list) != 3):nums = 3 - len(temp_list)while len(temp_list) < 3:temp_list += ['0' * 8]temp_str = "".join(temp_list)#print(temp_str)# 將三個(gè)8字節(jié)的二進(jìn)制轉(zhuǎn)換為4個(gè)十進(jìn)制temp_str_list = []for i in range(0,4):temp_str_list.append(int(temp_str[i*6:(i+1)*6],2))#print(temp_str_list)if nums:temp_str_list = temp_str_list[0:4 - nums]for i in temp_str_list:outputs += s[i]bin_str = bin_str[3:]outputs += nums * '='print("Encrypted String:n%s "%outputs)def My_base64_decode(inputs):# 將字符串轉(zhuǎn)化為2進(jìn)制bin_str = []for i in inputs:if i != '=':x = str(bin(s.index(i))).replace('0b', '')bin_str.append('{:0>6}'.format(x))#print(bin_str)# 輸出的字符串outputs = ""nums = inputs.count('=')while bin_str:temp_list = bin_str[:4]temp_str = "".join(temp_list)#print(temp_str)# 補(bǔ)足8位字節(jié)if(len(temp_str) % 8 != 0):temp_str = temp_str[0:-1 * nums * 2]# 將四個(gè)6字節(jié)的二進(jìn)制轉(zhuǎn)換為三個(gè)字符for i in range(0,int(len(temp_str) / 8)):outputs += chr(int(temp_str[i*8:(i+1)*8],2))bin_str = bin_str[4:] print("Decrypted String:n%s "%outputs)print() print(" *************************************") print(" * (1)encode (2)decode *") print(" *************************************") print()num = input("Please select the operation you want to perform:n") if(num == "1"):input_str = input("Please enter a string that needs to be encrypted: n")My_base64_encode(input_str) else:input_str = input("Please enter a string that needs to be decrypted: n")My_base64_decode(input_str)如此就可以得到flag
05397c42f9b6da593a3644162d36eb01 flag{05397c42f9b6da593a3644162d36eb01}話說這個(gè)題目有點(diǎn)坑,就是沒有提示flag的形式,必須裹上flag{}才可以。提交完成后看評論,都在說這題目坑。
什么是Base64呢(百度百科)
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法。可查看RFC2045~RFC2049,上面有MIME的詳細(xì)規(guī)范。
Base64編碼是從二進(jìn)制到字符的過程,可用于在HTTP環(huán)境下傳遞較長的標(biāo)識信息。采用Base64編碼具有不可讀性,需要解碼后才能閱讀。
Base64由于以上優(yōu)點(diǎn)被廣泛應(yīng)用于計(jì)算機(jī)的各個(gè)領(lǐng)域,然而由于輸出內(nèi)容中包括兩個(gè)以上“符號類”字符(+, /, =),不同的應(yīng)用場景又分別研制了Base64的各種“變種”。為統(tǒng)一和規(guī)范化Base64的輸出,Base62x被視為無符號化的改進(jìn)版本。
博主認(rèn)為對于base64的變種來說,就是轉(zhuǎn)換表和填充符號的區(qū)別,基本原理都是大同小異的。所以拿到編碼后,要搞清楚轉(zhuǎn)換表才是關(guān)鍵。
附錄:
base64_百度百科
python編寫base64加解密腳本(可變換碼表)_python_A_dmin的博客-CSDN博客
第31天:攻防世界-Mobile-easy-apk_J1nX的博客-CSDN博客
練習(xí)區(qū)easy-apk_移動開發(fā)_kjcxmx的博客-CSDN博客
總結(jié)
以上是生活随笔為你收集整理的攻防世界misc新手_[攻防世界]mobile新手练习区easy-apk的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythonpackage详解_Pyth
- 下一篇: windows系统禁止更改服务启动类型_