easyEZbaby_app
Jadx
這個文件一般是窗口界面,點擊中間的一般就是主函數
Obj1是用戶名,obj2是密碼
用戶名
????public?boolean?checkUsername(String?str)?{ |
這部分是MD5加密,加密的內容是 ?"zhishixuebao"
MD5解密腳本
import hashlib |
7da5fec345fecde5fdcd641f68e0b6d1
for循環,i+=2
p='7da5fec345fecde5fdcd641f68e0b6d1' |
7afc4fcefc616ebd
來看密碼
????public?boolean?checkPass(String?str)?{ |
循環15次,通過一系列的數學運算和字符轉換來生成flag
a='' for i in range(15): ???a+=chr(((255 - i) + 2) - 98-48) print(a) |
得到
onmlkjihgfedcba
那么flag就是用戶名+密碼
flag{7afc4fcefc616ebdonmlkjihgfedcba}
Ereere
Shift+f12查找字符串
定位到主函數
跟進sub_400864()函數,看到256,想到rc4
進入aFlag1233213211
回到主函數再跟進sub_400550
進aZyxwvutsrqponm發現base64密碼表
主函數
想將rc4進行了加密然后base64解密然后與ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ== 相比,如果相同就輸出flag的值
那么逆向的思路是
將base64進行換表之后ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ==
進行base64解密 然后再進行RC4解密就能得到flag?
import base64 flag = "" key = "ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ==" string1 = "ZYXWVUTSRQPONMLKJIHGFEDCBAabcdefghijklmnopqrstuvwxyz/+9876543210" ?# string1表示更換后的碼表 string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ?# string2表示原始碼表 print("Base64還原: ", key.translate(str.maketrans(string1, string2))) ??# 將 key 還原成初始碼表加密后的結果 Str = base64.b64decode(key.translate(str.maketrans(string1, string2))) ?# Base64解密,bytes型 print("Base64解密: ", Str) byte_4A0860 = [] aFlag1233213211 = "flag{123321321123badbeef012}" # rc4_init for i in range(256): ????byte_4A0860.append(i) v4 = 0 v3 = 0 for j in range(256): ????v5 = byte_4A0860[j] ????v3 = (v5 + v3 + ord(aFlag1233213211[int(j % len(aFlag1233213211))])) & 0xff ????byte_4A0860[j] = byte_4A0860[v3] ????byte_4A0860[v3] = v5 ????v4 = v4 + 1 ????if v4 >= len(aFlag1233213211): ????????v4 = 0 print("s_box:", end=" ") for j in range(256): ????print(byte_4A0860[j], end=" ") print() # rc4_crypt v4 = 0 v3 = 0 for k in range(len(Str)): ????v3 = (v3 + 1) & 0xff ????v4 = (byte_4A0860[v3] + v4) & 0xff ????v5 = byte_4A0860[v3] ????byte_4A0860[v3] = byte_4A0860[v4] ????byte_4A0860[v4] = v5 ????flag += chr(Str[k] ^ byte_4A0860[(byte_4A0860[v3] + byte_4A0860[v4]) & 0xff]) print(flag) |
flag{RC_f0ur_And_Base_s1xty_f0ur_Encrypt_!}
Mine-
下載完是一個exe程序,運行一下
拖到ida看main函數
這段代碼是一個用C++編寫的掃雷游戲程序,或許掃完了就能拿到flag?
ans:存儲游戲結束時顯示的字符串。
還有rand函數和srand函數的調用,說明這里游戲地圖是隨機生成的,所以不會根據輸入的點位來解密或者生成flag
修改rip
右鍵modify
F9運行
7ii3VecVgof3r6ssiP2g7E3HqwqhM
flag{h4pp4-M1n3-G4m3}