2024TFTCTF
Virtual-Rev#
我嘞个大vm
"XZD" xor
"STF" reg1 << reg2 ; reg1 * (2 ** reg2)
"QER" reg1 >> reg2 ; reg1 / (2 ** reg2)
"LQE"
"SQL"
"RALK"
"MQZL"
"LQDM"
"SAMO"
"XKA"
"MISZ"
"NEAZ"
"MINL"
"OAN"
"MAZ"
"NO"
"BRAILA"
"FLG"
寄存器
"l0"
"l1"
"l2"
"l3"
"l4"
"l5"
"lax"
"lip"
结构体
#include<stdint.h>
struct vm_regs
{
int64_t l0;
int64_t l1;
int64_t l2;
int64_t l3;
int64_t l4;
int64_t l5;
int64_t lax;
int64_t lip;
};
XZD 真值表:
operand1 | operand2 | result |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
这里的计算非常的坑,cdqe 、edx → rdx ,但是如果不考虑大数计算(> 32 位)的话,把这个当作异或应该也够了
对于符号位的处理有 bug ,而且结果只能看 32 位
每个指令最多使用 10 次
OP_XZD ; xor
OP_STF ; shl reg1,reg2
OP_QER ; shr reg1,reg2
OP_LQE ; and reg1, reg2
OP_SQL ; or reg1, reg2
OP_RALK ; add reg1, reg2
OP_MQZL ; GCD reg1, reg2 计算最大公约数
OP_LQDM ; div reg1, reg2
OP_SAMO ; mod reg1, reg2
OP_XKA ; mul reg1, reg2
OP_MISZ ; mov reg1, reg2
OP_NEAZ ; not reg1
OP_MINL ; not reg1 + 1
OP_OAN ; inc reg1 自加1
OP_MAZ
OP_NO ; nop
OP_BRAILA ; syscall 相关
