[羊城杯 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);
}