新手一枚,如有错误(不足)请指正,谢谢!!
<mark>个人博客:点击进入</mark>
题目链接:[安洵杯 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?!}