Logo WP

2024TFTCTF

CTFtime.org / TFC CTF 2024

 

Virtual-Rev#

virtual-rev.zip 

我嘞个大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 真值表:

operand1operand2result
000
011
101
110

这里的计算非常的坑,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 相关

 

Article Image