2021 羊城杯&网刃杯 re wp

@TOC

Resmc

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解密即可

reverse1

key长度64位 sm3加密
爆破可以拿到key ,然后输入后文件自动加密即可拿到flag
2021 羊城杯&网刃杯 re wp_第1张图片

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))

2048小游戏

2048小游戏
玩2048 成功后有判断
2021 羊城杯&网刃杯 re wp_第2张图片

Patch判断后 就可以到加密环节
把16格格的总和数作为参数参与加密 满足这个式子等于0x1a8cd即可拿到总和数
2021 羊城杯&网刃杯 re wp_第3张图片

直接解密,发现数据太大,弄不出来
可以动调解密,这个式子是一个线性关系,夹逼即可
Patch掉动调和这里
2021 羊城杯&网刃杯 re wp_第4张图片

不断尝试,8448成功过掉判断
后面的两个简单的加密 前四位和剩下的,动调可以拿到flag

你可能感兴趣的:(re,c语言)