文章目錄
- [FSCTF 2023]signin
- [FSCTF 2023]MINE SWEEPER
- [FSCTF 2023]Xor
- [FSCTF 2023]EZRC4
- [FSCTF 2023]ez_pycxor
- [FSCTF 2023]Tea_apk
- [FSCTF 2023]ezcode
- [FSCTF 2023]ezbroke
- [FSCTF 2023]rrrrust!!!
- [FSCTF2023]ezrev(未解決)
[FSCTF 2023]signin
UPX殼,用upx -d 文件名
脫殼
簡單的替換,得到flag。
[FSCTF 2023]MINE SWEEPER
IDA打開得到flag。
[FSCTF 2023]Xor
與0x12依次異或,
EXP:
enc = b't~suiFz{aM{aMsMwsakM`wdw`awo'
flag = []
for i in range(len(enc)):flag.append(chr(enc[i]^0x12))
print(''.join(flag))# flag{This_is_a_easy_reverse}
[FSCTF 2023]EZRC4
ezrc4,key和密文已給出,看rc4_crypt
沒要魔改,init里面是倆個S盒,直接用腳本解密。
EXP:
def rc4_decrypt(ciphertext, key):# 初始化 S-boxS = list(range(256))j = 0for i in range(256):j = (j + S[i] + key[i % len(key)]) % 256S[i], S[j] = S[j], S[i]# 初始化變量i = j = 0plaintext = []# 解密過程for byte in ciphertext:i = (i + 1) % 256j = (j + S[i]) % 256S[i], S[j] = S[j], S[i]k = S[(S[i] + S[j]) % 256]plaintext.append(byte ^ k)return bytes(plaintext)# 示例用法
encrypted_data = [0xEB,0xD,0x61,0x29,0xBF,0x9B,5,0x22,0xF3,0x32,0x28,0x97,0xE3,0x86,0x4D,0x2D,0x5A,0x2A,0xA3,0x55,0xAA,0xD5,0xB4,0x6C,0x8B,0x51,0xB1] # 替換成你的密文
encryption_key = b'wanyuanshenwande' # 替換成你的密鑰decrypted_data = rc4_decrypt(encrypted_data, encryption_key)
print("Decrypted Data:", decrypted_data.decode('utf-8'))# Decrypted Data: flag{I_L0VE_gensh1n_Imp4ct}
[FSCTF 2023]ez_pycxor
pyc文件,找個在線網站反編譯一下,
源代碼:
#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.10flag = input('plz input your flag:')
encoded_flag = []
key = 'FUTURESTARS'
ciphertxt = [168,169,185,170,160,157,197,132,226,134,134,145,255,242,130,139,234,140,180,229,179,246,243,181,183,182,249,163,254,189,246,166]
for i in range(len(flag)):encoded_flag.append((ord(flag[i]) ^ 168) + i)
for i in range(len(encoded_flag)):if i % 2 == 0:encoded_flag[i] ^= ord(key[i % 11])if i % 2 == 1:encoded_flag[i] ^= ord(key[i % 11])
if encoded_flag == ciphertxt:print('OK! You have crack it!')return None
簡單的加密,逆向一下,就是根據索引奇偶執行異或先執行和key的循環異或,再減去i異或168、
EXP:
key = 'FUTURESTARS'
ciphertxt = [168, 169, 185, 170, 160, 157, 197, 132, 226, 134, 134, 145, 255, 242, 130, 139, 234, 140, 180, 229, 179,246, 243, 181, 183, 182, 249, 163, 254, 189, 246, 166]
flag = []
for i in range(len(ciphertxt)):flag.append(ciphertxt[i] ^ ord(key[i % 11]))
for i in range(len(ciphertxt)):flag[i] = chr((flag[i] - i) ^ 168)
print("".join(flag))# FSCTF{8a3ccd61ab7ff9e87acb9c9d1}
[FSCTF 2023]Tea_apk
apk文件,用jadx打開,
看MainActivity,
上面是XXTEA的加密過程,這里直接用在線網站解密就好。
[FSCTF 2023]ezcode
一個py bytecode的題目,之前寫過一篇bytecode反編譯的博客。不太會的可以去看看。
這里就是四個函數,func1 func2 func3 還有 encode,
這里就是main函數,可以看到一個k,input是 m 對輸入和k進行一個func1的操作,然后對得到的密文c做一個encode的操作,之后進行比較。
func1 函數,題做多點就敏感了,這里就是rc4了。func2創造S盒,func3 加密處理。
值得注意的是func3,RC4的加密過程魔改了一部分,
多了一個key,
encode部分就是一個改了碼表的base64編碼
所以逆向一下,先對密文進行base64解碼,然后RC4解密,
記得轉換為整數。
string = "=.#M?Q??ò\nt?D-v|·"
numeric_list = [ord(char) for char in string]
print(numeric_list)# [61, 46, 35, 77, 216, 81, 239, 157, 242, 10, 116, 194, 208, 173, 118, 124, 183]
最后進行RC4解密。EXP:
def rc4_decrypt(ciphertext, key):# 初始化 S-boxS = list(range(256))j = 0for i in range(256):j = (j + S[i] + key[i % len(key)]) % 256S[i], S[j] = S[j], S[i]# 初始化變量i = j = 0plaintext = []y = 'FSCTF'# 解密過程for byte in ciphertext:i = (i + 1) % 256j = (j + S[i]) % 256S[i], S[j] = S[j], S[i]k = S[(S[i] + S[j]) % 256]plaintext.append(byte ^ k ^ ord(y[i % 5]))return bytes(plaintext)# 示例用法
encrypted_data = [61, 46, 7, 35, 77, 216, 81, 239, 157, 242, 12, 116, 194, 208, 173, 118, 124, 183] # 替換成你的密文
encryption_key = b'XFFTnT' # 替換成你的密鑰decrypted_data = rc4_decrypt(encrypted_data, encryption_key)
print("Decrypted Data:", decrypted_data.decode('utf-8'))# Decrypted Data: FSCTF{G00d_j0b!!!}
[FSCTF 2023]ezbroke
用WinHex查看一下。
PE文件頭和偏移都錯了。修改完保存再次用expinfope查看,發現UPX殼,但是脫殼失敗了。
原來UPX標識也被魔改了。
這之后就可以了。
一個VM虛擬機的題目,
code里面是操作碼opcode,下面是三個指令操作,這里都給出了名字,不用自己辨別了。
可以看到其實只有一個0x17的操作。
還有一個check,enc_flag里面是密文。
大致模擬一下出來的指令,可以知道是逐個字節異或。
直接寫EXP:
enc = [0x51, 0x44, 0x54, 0x43, 0x51, 0x6C, 0x4E, 0x27, 0x62, 0x37,0x64, 0x62, 0x74, 0x74, 0x72, 0x64, 0x64, 0x71, 0x62, 0x26,0x26, 0x6E, 0x37, 0x75, 0x65, 0x27, 0x7C, 0x24, 0x37, 0x7A,0x6E, 0x37, 0x67, 0x65, 0x27, 0x63, 0x24, 0x74, 0x63, 0x26,0x27, 0x79, 0x36, 0x36, 0x36, 0x6A, 0x00]
flag = []
for i in range(len(enc)):flag.append(chr(enc[i] ^ 0x17))
print("".join(flag))# FSCTF{Y0u successfu11y br0k3 my pr0t3ct10n!!!}
[FSCTF 2023]rrrrust!!!
明顯的密文,
往下看可以看到比較的地方,
al寄存器里面存放的就是 經過加密后的數據,
這里直接用動態調試,輸入32個1,觀察每次加密后的結果。
動態調試的方法就是將jnz修改成jz,這樣才可以看到每次加密的數據。
可以發現是循環異或,和XFFTnT,寫個EXP
enc = [0x3E, 0x2A, 0x27, 0x33, 0x15, 0x03, 0x3D, 0x77, 0x25, 0x64,0x03, 0x67, 0x07, 0x32, 0x76, 0x0B, 0x1C, 0x21, 0x2B, 0x32,0x19, 0x23, 0x5E, 0x26, 0x69, 0x22, 0x3B]
key = 'XFFTnT'
flag = []
for i in range(len(enc)):flag.append(chr(enc[i] ^ ord(key[i%6])))
print(''.join(flag))# flag{We1c0m3_t0_rust_w0r1d}
[FSCTF2023]ezrev(未解決)
這一題暫時沒有解出flag。
大致的思路是,main函數傳入了四個大整數,
func1 函數將其轉化為字符串,func2函數是base64編碼,func3做了一點減法運算。
我也不太清楚我自己哪里有點問題,解出來的flag特別奇怪。暫時先放一下了。o(╥﹏╥)o還要準備考試了。
什么時候解出來再更了,而且這題沒有官方wpo(╥﹏╥)o。