[full writeup](https://ctf.harrisongreen.me/2019/x-mas-ctf/discount_vmprotect/)
Disassembled code:
program 1:
```    __start:[00] :: push(res[128])      | r[02] :: strcpy
    __loop:[03] :: dup                 | r r[04] :: dup                 | r r r[05] :: res[128] = pop()    | r r[07] :: push(flag[pop()])   | r f[r][08] :: jz 0x12[0A] :: push 0x1            | r 1[0C] :: add                 | (r+1)[0D] :: dup                 | (r+1) (r+1)[0E] :: dup                 | (r+1) (r+1) (r+1)[0F] :: sub                 | (r+1) (r+1)[10] :: jz 0x3              | (r+1)
    __end_of_flag:[12] :: push 0x23           | len 0x23[14] :: sub                 | (len - 0x23)[15] :: jz 0x1b
    __incorrect_length:[17] :: push 0x0[19] :: res[0] = pop()      | res[0] = 0
    __correct_length:[1B] :: push 0x0[1D] :: res[128] = pop()    | res[128] = 0[1F] :: ret```
program 2:```    __start:[00] :: push(res[128])          | r[02] :: dup                     | r r[03] :: dup                     | r r r[04] :: res[128] = pop()        | r r[06] :: push(flag[pop()])       | r f[r][07] :: dup                     | r f[r] f[r][08] :: jz 0x28                 | r f[r]
    __flag_not_zero:[0A] :: ror                     | r (f[r] >>> 1)[0B] :: push 0x63               | r (f[r] >>> 1) 0x63[0D] :: xor                     | r ((f[r] >>> 1)^0x63)[0E] :: push 0x98               | r ((f[r] >>> 1)^0x63) 0x98[10] :: add                     | r (((f[r] >>> 1)^0x63)+0x98)[11] :: not                     | r ~(((f[r] >>> 1)^0x63)+0x98)[12] :: dbg     [13] :: push(res[128])          | r ~(((f[r] >>> 1)^0x63)+0x98) r[15] :: push 0xa                | r ~((f[r] >>> 1)^0x63)+0x98) r 0xa[17] :: add                     | r ~(((f[r] >>> 1)^0x63)+0x98) (r+0xa)[18] :: get res[top]            | r ~(((f[r] >>> 1)^0x63)+0x98) res[(r+0xa)][19] :: sub[1A] :: jz 0x20
    __incorrect_char[1C] :: push 0x0[1E] :: res[0] = pop()
    __correct_char[20] :: push 0x1[22] :: add[23] :: dup[24] :: dup[25] :: xor[26] :: jz 0x2
    __flag_zero:[28] :: ret```