re | [MRCTF2020]VirtualTree

re | [MRCTF2020]VirtualTree

这个题是一个错题,是有多解的。
原因是使用了abs函数

考察了二叉树后序遍历,和一点基本花指令,还有一点点smc的内容。

image

直接丢exp了:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

unsigned char cmps[]={0x17,0x63,0x77,0x3,0x52,0x2E,0x4A,0x28,0x52,0x1B,0x17,0x12,0x3A,0xA,0x6C,0x62};
unsigned char buff[1000],size=0;

int order[] = {12,11,6,15,14,10,5,2,9,4,13,8,7,3,1,0};   // 后序(先右后左) 

int main(){
	unsigned char n[16];
	int i;
	for(i=0;i<16;i++)
		n[i]='A'+i;
	// 先倒序修正cmps
	cmps[15] -= 2;
	cmps[14] ^= cmps[15];
	// cmps[12] += cmps[2];
	cmps[12] = cmps[2] - cmps[12];
	cmps[11] ^= cmps[12];
	// cmps[10] += cmps[7];
	cmps[10] = cmps[7] - cmps[10];
	// cmps[9] += cmps[8];
	cmps[9] = cmps[8] - cmps[9];
	cmps[8] ^= cmps[7];
	cmps[7] -= 3;
	// cmps[6] += cmps[1];
	cmps[6] = cmps[1] - cmps[6];
	cmps[4] ^= cmps[5];
	cmps[3] += cmps[7];
	cmps[2] -= 7;
	cmps[1] ^= cmps[2];
	cmps[0] -= 10;
	// 再根据后序遍历xor 
	for(i = 0; i < 16; i ++){
		cmps[i] ^= n[order[i]];
	}
	for (i = 0; i < 16; i ++){
		printf("[%d] %d: %c \n", i, cmps[i], cmps[i]);
	}
	printf("%s \n", cmps);
	
	return 0;
}

posted @ 2023-01-08 13:18  Mz1  阅读(26)  评论(0编辑  收藏  举报