发布时间:2024-02-03 19:30
@TOC
Smc动调即可,找到加密函数,恢复栈帧,即可看到加密函数,变异的base64
#include
#include
unsigned char a[100]={\"H>oQn6aqLr{DH6odhdm0dMe`MBo?lRglHtGPOdobDlknejmGI|ghDb<4\"};
unsigned char s[100]={ 0xE4, 0xC4, 0xE7, 0xC7, 0xE6, 0xC6, 0xE1, 0xC1, 0xE0, 0xC0,
0xE3, 0xC3, 0xE2, 0xC2, 0xED, 0xCD, 0xEC, 0xCC, 0xEF, 0xCF,
0xEE, 0xCE, 0xE9, 0xC9, 0xE8, 0xC8, 0xEB, 0xCB, 0xEA, 0xCA,
0xF5, 0xD5, 0xF4, 0xD4, 0xF7, 0xD7, 0xF6, 0xD6, 0xF1, 0xD1,
0xF0, 0xD0, 0xF3, 0xD3, 0xF2, 0xD2, 0xFD, 0xDD, 0xFC, 0xDC,
0xFF, 0xDF, 0x95, 0x9C, 0x9D, 0x92, 0x93, 0x90, 0x91, 0x96,
0x97, 0x94, 0x8A, 0x8E};
char q[100]={\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"};
int p[100];
int main(){
//int n=strlen(a);
//printf(\"%d \",n);
for(int i=0;i<56;i+=4){
a[i]^=0xa6;
a[i+1]^=0xa3;
a[i+2]^=0xa9;
a[i+3]^=0xac;
}
for(int i=0;i<56;i++){
//printf(\"%x \",a[i]);
for(int j=0;j<64;j++){
if(a[i]==s[j]){
printf(\"%d \",j);
p[i]=j;
}
}
}
for(int i=0;i<56;i++){
printf(\"%c\",q[p[i]]);
}
return 0;
}
找到对应的顺序后,用base64解密即可
key长度64位 sm3加密
爆破可以拿到key ,然后输入后文件自动加密即可拿到flag
from gmssl import sm3, func
from Crypto.Util.number import *
if __name__ == \'__main__\':
#key = long_to_bytes(0x32)
#print(key)
for i in range(33,127):
key2=long_to_bytes(i)
key = b\'wel30m_t0_sm3!!!\'+key2
y = sm3.sm3_hash(func.bytes_to_list(key))
print(y,chr(i))
Patch判断后 就可以到加密环节
把16格格的总和数作为参数参与加密 满足这个式子等于0x1a8cd即可拿到总和数
直接解密,发现数据太大,弄不出来
可以动调解密,这个式子是一个线性关系,夹逼即可
Patch掉动调和这里
不断尝试,8448成功过掉判断
后面的两个简单的加密 前四位和剩下的,动调可以拿到flag