逆向題目質量高,收穫很多
0x1.Check_1n
提示語句是中文,IDA7.0要能搜到中文字符串。
找到密碼錯誤的提示語句,查看引用。
拿到開機密碼:HelloWorld
輸入HelloWorld,進入“桌面”,打開flag,會提示base64編碼的Why don’t you try the magic brick game,提示玩打磚塊遊戲,玩打磚塊遊戲死了就出flag
另一種思路,看到奇怪字符串2i9Q8AtFJTfL3ahU2XGuemEqZJ2ensozjg1EjPJwCHy4RY1Nyvn1ZE1bZe,查引用,發現base58的關鍵數組。base58解密。
0x2.Chelly’s ldentity
Chelly是啥,一查,哦,看來師傅們都是老二次元了(手動狗頭.jpg)。
C++程序,你來回點函數,發現有些變量可以變換,有提示作用。
函數多,邏輯理清楚,整體分三部分,輸入一部分,算法一部分,最後結果比較一部分。算法又可分成輸入校驗和算法兩部分。
原本的輸入std::cin後面的變量,但發現下面判斷長度的函數的變量不是input,而是instr,這樣分析input賦值給instr。
sub_4111BD()判斷長度:16字符。
sub_411721()是算法實現函數,點進去
找while循環,沒循環如何遍歷。有一個數組與輸入字符的每個值比較,如果這個數組裏的值小於輸入字符,把它們累加起來,輸入字符再和累加的值異或。關鍵是找這個數組,v9數組最早出現在sub_4116E0,點進去sub_4116E0
數組生成條件sub_411672,滿足條件就放到數組裏,進入sub_411672。
質數生成函數:生成0-128的質數.。
算法搞清楚了,康康最後的結果比較函數。
賦值的那個數組就是結果數組。
腳本上場,登~ 登~ 登~(自帶音效)
def is_prime_num(num): #判斷num是否爲質數
for i in range(2,num):
if num % i==0:
return False
return True
def create_table(n): #生成n之間的質數列表
table=[]
for num in range(2,n):
if is_prime_num(num):
table.append(num)
return table
def de_anwser(_key):
table=create_table(128)
flag=''
for k in _key:
for ch in range(128):
count=0
i=0
while table[i]<ch:
count+=table[i]
i+=1
tmp=ch^count
if tmp==k:
flag+=chr(ch)
return flag
key=[438,1176,1089,377,377,1600,924,377,1610,924,637,639,376,566,836,830
]
flag=de_anwser(key)
print(flag)
#flag{Che11y_1s_EG0IST}
0x3.BabyDriver
sys的後綴,驅動題,找DriverEntry。鍵盤過濾驅動
標準的鍵盤過濾驅動
因爲是鍵盤過濾驅動,主要看下IRP讀操作的回調函數(第二個函數),也就是CompletionRoutine的位置
發現是個地圖題,就是上下左右由於鍵盤過濾驅動的影響,真實的值需要查表
maze類:1.內存中畫出一張地圖(地圖變換) 2.明確起點和終點 3.(四個字符對應上下左右)flag就是走出的路徑
地圖:
上下左右 IKJL
走出flag,LKKKLLKLKKKLLLKKKLLLLLL
輸入md5加密後就是flag
0x4.WannaReverse
勒索病毒,自帶換壁紙功能,拿到題還挺懵的,這就上勒索了(這麼強嗎_流汗.jpg)
拿到四個文件,主要逆向WannaReverse.exe這個,libcrypto-1_1.dll是openssl庫來提供rsa的相關加密函數,clickme.exe是仿照wannacry病毒的界面程序(自帶換壁紙功能),
flag.txt.Encry是被WannaReverse.exe加密的flag。
我的IDA反編譯的函數,函數名沒有提示是那種函數,這就很難受,
WannaCry的加密原理RSA2048 + AES隨機密鑰