[NCTF 2018]wcyvm

43 篇文章 1 订阅
20 篇文章 0 订阅
#include<stdio.h>
int main()
{
	int j = 0;
	int i =80;
	int op[] =
	{
0x8,0x1,0x0,0x8,0x3,0x46,0xe,0x15,0xa,0x1,
0x9,0x2,0xb,0xa,0x1,0xa,0x2,0x9,0x1,0x11,
0x1,0xd,0x1,0x3,0xf,0x8,0x8,0x1,0x0,0x8,0x3,
0x47,0xe,0x46,0xa,0x1,0x1a,0x2,0x6,0x1d,
0x1,0x4,0x14,0x2,0x1,0x19,0x1,0x2,0x1b,
0x1,0x1,0x1d,0x1,0x6e,0x13,0x1,0x63,0x15,
0x1,0x74,0x13,0x1,0x66,0x1c,0x2,0x1,0x9,
0x1,0x11,0x1,0xd,0x1,0x3,0xf,0x22,0x64	};
	while (i--)
	{

		switch (op[j])
		{
		case 0x8:printf("%d\tmov\tR%d,%d\n", j, op[j+1]-1, op[j+2]); j += 3; break;
		case 0x9:printf("%d\tpop\tR%d\n", j, op[j+1]-1); j += 2; break;
		case 0xA:printf("%d\tpush\tR%d\n", j, op[j+1]-1); j += 2; break;
		case 0xB:printf("%d\tR0=getchar()\n", j); j ++; break;
		case 0xC:printf("%d\tR0=putchar()\n", j); j++; break;
		case 0xD:printf("%d\tcmp\tR%d,R%d\n", j, op[j+1]-1, op[j+2]-1);
			printf(" \tjnz\t%d\n",j+3);
			printf(" \tmov\tv1,80\n"); j += 3; break;
		case 0xE:printf("%d\tjmp\t%d\n", j,op[j+1]); j += 2; break;
		case 0xF:printf("%d\tand\tv1,80\n", j);
			printf("\ttest\tv1,v1\n");
			printf("\tjnz\t%d\n", op[j + 1]); j += 2; break;
		case 0x10:printf("%d\tand\tv1,80\n", j);
			printf("\ttest\tv1,v1\n");
			printf("\tjz\t%d\n", op[j + 1]); j += 2; break;
		case 0x11:printf("%d\tinc\tR%d\n", j, op[j+1]-1); j += 2; break;
		case 0x12:printf("%d\tdec\tR%d\n", j, op[j+1]-1); j += 2; break;
		case 0x13:printf("%d\tadd\tR%d,%d\n", j, op[j+1]-1, op[j+2]); j += 3; break;
		case 0x14:printf("%d\tsub\tR%d,R%d\n", j, op[j+1]-1, op[j+2]-1); j += 3; break;
		case 0x15:printf("%d\txor\tR%d,%d\n", j, op[j+1]-1, op[j+2]); j += 3; break;
		case 0x16:printf("%d\tand\tR%d,R%d\n", j, op[j+1]-1, op[j+2] - 1); j += 3; break;
		case 0x17:printf("%d\tor\tR%d,R%d\n", j, op[j+1]-1, op[j+2] - 1); j += 3; break;
		case 0x19:printf("%d\tmov\tR%d,R%d\n", j, op[j+1]-1, op[j+2] - 1); j += 3; break;
		case 0x1A:printf("%d\tmov\tR%d,R%d\n", j, op[j+1]-1, op[j+2] - 1); j += 3; break;
		case 0x1B:printf("%d\tmov\tR%d,[R%d]\n", j, op[j+1]-1, op[j+2] - 1); j += 3; break;
		case 0x1C:printf("%d\tmov\t[R%d],%d\n", j, op[j+1]-1, op[j+2] - 1); j += 3; break;
		case 0x1D:printf("%d\tmul\tR%d,%d\n", j, op[j+1]-1, op[j+2] ); j += 3; break;
		}
	}
	return 0;
}
0       mov     R0,0
3       mov     R2,70
6       jmp     21
8       push    R0
10      pop     R1
12      R0=getchar()
13      push    R0
15      push    R1
17      pop     R0
19      inc     R0
21      cmp     R0,R2
        jnz     24
        mov     v1,80
24      and     v1,80
        test    v1,v1
        jnz     8
26      mov     R0,0
29      mov     R2,71
32      jmp     70
34      push    R0
36      mov     R1,R5
39      mul     R0,4
42      sub     R1,R0
45      mov     R0,R1
48      mov     R0,[R0]
51      mul     R0,110
54      add     R0,99
57      xor     R0,116
60      add     R0,102
63      mov     [R1],0
66      pop     R0
68      inc     R0
70      cmp     R0,R2
        jnz     73
        mov     v1,80
73      and     v1,80
        test    v1,v1
        jnz     34

EXP:

enc = [0x36d3, 0x2aff, 0x2acb, 0x2b95, 0x2b95, 0x2b95, 0x169f, 0x186d, 0x18d7, 0x1611, 0x18d7, 0x2b95, 0x2c23, 0x2ca9,
       0x1611, 0x1611, 0x18d7, 0x2aff, 0x1849, 0x18fb, 0x2acb, 0x2a71, 0x1735, 0x18d7, 0x1611, 0x2acb, 0x15dd, 0x18d7,
       0x2c23, 0x169f, 0x15dd, 0x2b95, 0x169f, 0x156b, 0x186d, 0x2aff, 0x1611, 0x1611, 0x15dd, 0x2aff, 0x2c23, 0x2acb,
       0x15dd, 0x15dd, 0x186d, 0x1849, 0x2b95, 0x156b, 0x1735, 0x18fb, 0x18fb, 0x2a71, 0x2aff, 0x1735, 0x2c23, 0x15dd,
       0x18d7, 0x2a71, 0x18d7, 0x18d7, 0x2c23, 0x2aff, 0x156b, 0x2c23, 0x169f, 0x35af, 0x2ca9, 0x32b5, 0x2aff, 0x3039,
       ]
for i in range(len(enc) - 1, -1, -1):
    print(chr((((enc[i] - 102) ^ 116) - 99) // 110), end='')

nctf{3e1ce77b70e4cb9941d6800aec022c813d03e70a274ba96c722fed72783dddac}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值