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;
}
to be or not to be, is a question.