CISCN2022华北赛区半决赛 Reverse WP

一共三个题目,全场一共被解出两个题目,本次解出两个题目,其中rtMaze为三血。

js

不明觉厉的js混淆,但核心逻辑处不难发现,先是base64,然后异或一个常数。但是case3, base64那个地方会报错,需要手动注释,把f赋值为base64后的结果才能继续调试,提取出密文。


rtMaze

这是ARM 的Rt-Thread架构的文件,32位。第一步,需要修复一下ROM基地址。随意手动反汇编一下,发现许多地址都是0x60000000以上。尝试一番还是有问题。

最后根据RAM的起始地址,因为加载时PC的第一条指令就在RAM的开始位置出,可以发现是以6001xxxx(这里因为是修复过的,因为指可能略有不同)。于是修复基地址为6001000。

后续通过字符串引用,以及关键字符串上下文的手动反汇编,找到了get flag的函数。加密数据以及加密逻辑都在下两图中。先是走了一个迷宫,然后在迷宫输入最后追加了一个a,构成48个字节。随后作为xtea加密的key,这个key是进行了循环使用。


#include <stdio.h>
#include <stdint.h>

void XteaDec(unsigned int* result, uint32_t* key)
{
	unsigned int v0; // r4
	unsigned int v1; // lr
	unsigned int delta = 0x9E3779B9;
	v0 = *result;
	v1 = result[1];
	for (uint32_t i = 0xC6EF3720; i != 0; )
	{
		v1 -= (i + key[(i >> 11) & 3]) ^ (((v0 >> 5) ^ (16 * v0)) + v0);
		i -= delta;
		v0 -= (i + key[i & 3]) ^ (((v1 >> 5) ^ (16 * v1)) + v1);
	}
	*result = v0;
	result[1] = v1;
}

int main()
{

	uint8_t key[] = "dddwwawwwwaasdsasawawdwaaasawassssdwdsddssasddwa";
	uint32_t enc[11] = { 0 };
	enc[0] = 0x40627CCA;
	enc[1] = 3864601579;
	enc[2] = 3019759583;
	enc[3] = 2472124641;
	enc[4] = 0x772C6BE7;
	enc[5] = 0xE1D02590;
	enc[6] = 0x62EFA83A;
	enc[7] = 0xF2F1D54E;
	enc[8] = 0xCC3CF3C6;
	enc[9] = 0xE35FB4A1;
	
	XteaDec(enc, (uint32_t*)key);
	XteaDec(enc+2, (uint32_t*)key + 4);
	XteaDec(enc+4, (uint32_t*)key + 8);
	XteaDec(enc+6, (uint32_t*)key );
	XteaDec(enc+8, (uint32_t*)key + 4);
	
	printf("flag{%s}", enc);



	return 0;
}
posted @ 2022-07-08 23:15  辰星-cxing  阅读(227)  评论(0编辑  收藏  举报