re學習筆記(51)BUUCTF-re-[安洵杯 2019]crackMe

新手一枚,如有錯誤(不足)請指正,謝謝!!
個人博客:點擊進入
題目鏈接:[安洵杯 2019]crackMe

IDA64載入很懵逼,啥也沒有
在這裏插入圖片描述
動調的時候出來一句hook,動調試試
OD搜索字符串,在輸入call之後下斷點
在這裏插入圖片描述
輸入假碼,回車程序被斷下來
F8單步,發現在調用messagebox函數的時候執行了0x6AB1A0地址的代碼
(我的映像基地址是0x690000)
在這裏插入圖片描述
F7進call,來到這裏
在這裏插入圖片描述
IDA查看,Str是base64表的字符表,進行了大小寫的轉換
然後彈窗進行提示。
AddVectoredExceptionHandler()註冊了一個異常處理函數?
(這塊如果有錯請指出)
第一個參數0表示註冊的Handler函數在出現異常後會優先觸發,第二個參數表示觸發執行的函數
在這裏插入圖片描述
然後VEH異常Hander函數中進行了SM4加密後註冊了一個SEH異常處理
SM4的S盒、FK\CK參數都在全局變量保存着
SM4的密鑰爲v2數組
在這裏插入圖片描述
SEH異常處理的函數爲sub_6A2C30
在這裏插入圖片描述
sub_6A126C()函數
在這裏插入圖片描述
然後OD繼續執行,執行出messagebox函數,到這裏觸發異常
在這裏插入圖片描述
此時程序會先執行一個VEH異常處理,在VEH異常處理中將輸入進行了SM4加密,然後註冊了SEH異常處理
執行完VEH異常處理後程序執行SEH異常處理,在SEH異常處理中先將Str2每兩位交換一下位置,然後將輸入再進行base64變種加密,最後將Str1與Str2進行比對

寫腳本解密

from pysm4 import encrypt, decrypt
import base64
result0 = "1UTAOIkpyOSWGv/mOYFY4R=="
# key = "where_are_u_now?"
# print(key.encode().hex())
temp0 = list(result0)
for i in range(0,len(result0),2):
    temp0[i],temp0[i+1] = temp0[i+1],temp0[i]
result = ''.join(temp0)

biao = str.maketrans("yzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/abcdefghijklmnopqrstuvwx","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
temp1 = base64.b64decode(result.translate(biao).encode('utf-8'))
# print(temp1.hex())
cipher_num = 0x59d095290df2400614f48d276906874e
mk = 0x77686572655f6172655f755f6e6f773f

clear_num = decrypt(cipher_num, mk)
print('flag{'+bytes.fromhex(hex(clear_num)[2:]).decode()+'}')

在這裏插入圖片描述
得到最終flag爲flag{SM4foRExcepioN?!}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章