[羊城杯 2021]BabySmc

[羊城杯 2021]BabySmc

IDA打开发现爆红
在这里插入图片描述

下面是一大段不能被正常识别为汇编,不是花指令就是smc,结合题目名字发现是smc

在这里插入图片描述

这是程序中smc的自解密函数

在这里插入图片描述

VirtaulProtect(地址,大小,权限,存放旧属性的指针);

会先把lpAddress改为可写,然后进行ROR和异或操作还原机器码

在他执行完下断点,就可以看F5的伪代码

在这里插入图片描述

现在已经被他自己解密完成的,选中之前无法正常识别的按C然后选择强制转换(Force)

在这里插入图片描述

然后在按一个F5就可以看见伪代码

在这里插入图片描述

从大致特征可以看出这是一个base64的解码操作,但是多了一个异或操作

在这里插入图片描述

包括前面的一大段也是相同操作,把异或的值取出来就行

unsigned char key[4] = { 0xA6 ,0xA3,0xA9,0xAC };

在这里插入图片描述

然后就是一个比对的操作,//密文就是

char ciphertxt[] = "H>oQn6aqLr{DH6odhdm0dMe`MBo?lRglHtGPOdobDlknejmGI|ghDb<4\0";

在这里插入图片描述

input输入之后->base64解码->异或->比对

程序逻辑还是比较简单的就是伪代码出来还是有点难看,解密的步骤反着来就行,这里的码表不是标准的需要换一下

密文->异或->base64换表->base64解码

shift+e一键取出,或者去内存地址找table也是可以的

在这里插入图片描述

然后按上面的解密就行

void test() {
	 char table[] =
	{
	  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,0
	};
	char ciphertext[] = "H>oQn6aqLr{DH6odhdm0dMe`MBo?lRglHtGPOdobDlknejmGI|ghDb<4\0";
	unsigned char key[4] = { 0xA6 ,0xA3,0xA9,0xAC };
	int length = strlen(ciphertext);
	for (size_t i = 0; i < length; i++)
	{
		ciphertext[i] ^= key[i % 4];
	}
	char base64[66] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\0";
	for (size_t i = 0; i < length; i++)
	{
		char* p = strchr(table, ciphertext[i]);
		if (p == nullptr) {
			ciphertext[i + 1] = '\0';
			break;
		}
		ciphertext[i] = base64[p - table];
	}
	u8 *res= b64_decode(ciphertext);
	puts((char*)res);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值