LG Uplus 2024 Final

» CTF

image.png

2등 roKyC

You Can (Not) Trie

Trie → 문자열 탐색을 위한 자료구조

Trie에 flag가 담겨 있고, 입력을 주면 Trie에 입력값이 존재하는지 확인

Trie에 존재하면서 hash가 일치하는 입력값이 flag

Trie 구조체에 들어 있는 문자열들을 추출한 뒤 hash 비교해주면 flag를 얻을 수 있다.

Trie 구조체에 문자열이 하나 밖에 안 들어 있는 것 같았다.

아래는 문자열 추출 스크립트

# gdb -q -x script.py
import gdb
from string import printable

ge = gdb.execute
gp = gdb.parse_and_eval

white = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{_}"

ge("file ./problem")

gdb.Breakpoint("*0x402276")

ge("r " + "asdfasdfasdfa")

inferior = gdb.selected_inferior()

rdi = int(gp("$rdi"))
rdi = int.from_bytes(bytes(inferior.read_memory(rdi, 8)), "little")

tmp = bytes(inferior.read_memory(rdi, 256 * 70))

trie = []
for i in range(70):
    trie.append(tmp[256*i:256*(i+1)])

idx = 0
flag = ""
while (True):
    cur = trie[idx]

    if cur[0] != 0:
        break
    for tmp_idx, val in enumerate(cur):
        if val != 0:
            flag += chr(tmp_idx - 1)
            print(flag)
            idx = val+1
            break

flag: lguplus2024{cOnGra7uLat1Ons!c0ngr4tulA7Ions!CONgraTUlAt1OnS!}


mathematics

일종의 VM이다. 총 VM 루틴이 4번 돌아가게 되는데,

64byte input을 넣으면 input을 16바이트 단위로 4개로 끊게 되고, 각 VM 루틴의 command의 operand로 input이 박히게 된다.

아래 script로 4번의 VM command를 추출하고

# gdb -q -x script.py
import gdb

ge = gdb.execute
gp = gdb.parse_and_eval

ge("file ./mathematics")

image_base = 0x555555554000

gdb.Breakpoint(f"*{image_base + 0x8F62}")

input = "01236881517984651616165987941651213213464684616321acacacacacacac"

ge("run <<< " + input, to_string=True)

for i in range(4):
    inferior = gdb.selected_inferior()
    pc_start = int(gp("$rax"))
    pc_end = int(gp("$rsi"))

    rsp = int(gp("$rsp"))
    cmd = bytes(inferior.read_memory(rsp+0x20, 8))
    print(cmd)
    cmd = int.from_bytes(cmd, "little")

    print(bytes(inferior.read_memory(cmd, pc_end))[:500])
    ge("c", to_string=True)

아래 스크립트로 VM 커멘드 파싱

cmd = b'\x03\x00\xef\xcd\xab\x89gE#\x01\x03\x01\xe0\xd1\x96\xc8t\xb3R\xa1\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x10\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x00\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x06\x05\x02\x06\x0f\x02\x03\x15<\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x01\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x06\x05\x02\x06\x0f\x02\x03\x15q\x00\x00\x00\x03\x05@\x00\x00\x00\x00\x00\x00\x00\x03\x06\x08\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x03\x07\x00\x10\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\x07\n\x05\x07\x04\x03\x08\x00\x12\x00\x00\x00\x00\x00\x00\x04\n\x04\x07\n\x06\x05\x08\n\x05\x08\x03\x03\t\x00\x14\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\t\n\x05\t\x03\x01\n\x07\x01\x0b\x08\x01\x0c\t\n\n\x0b\x0c\x0c\n\x02\x0c\t\x05\x04\x06\x0f\x04\x05\x15\xce\x00\x00\x00\x05\x03\x06\x0f\x03\x05\x15\xc4\x00\x00\x00\x05\x02\x06\x0f\x02\x05\x15\xba\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x04\x01\x00\x00\x00\x00\x00\x00\x00\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x00\x14\x00\x00\x00\x00\x00\x00\x04\x07\x02\x07\x07\x05\x05\x06\x07\x01\x08\x06\r\x08\x02\x05\x00\x08\x05\x02\x04\x0f\x02\x03\x15u\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
#cmd = b'\x03\x00e\x84yQ\x81h#\x01\x03\x01\xe0\xd1\x96\xc8t\xb3R\xa1\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x10\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x00\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x06\x05\x02\x06\x0f\x02\x03\x15<\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x01\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x06\x05\x02\x06\x0f\x02\x03\x15q\x00\x00\x00\x03\x05@\x00\x00\x00\x00\x00\x00\x00\x03\x06\x08\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x03\x07\x00\x10\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\x07\n\x05\x07\x04\x03\x08\x00\x12\x00\x00\x00\x00\x00\x00\x04\n\x04\x07\n\x06\x05\x08\n\x05\x08\x03\x03\t\x00\x14\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\t\n\x05\t\x03\x01\n\x07\x01\x0b\x08\x01\x0c\t\n\n\x0b\x0c\x0c\n\x02\x0c\t\x05\x04\x06\x0f\x04\x05\x15\xce\x00\x00\x00\x05\x03\x06\x0f\x03\x05\x15\xc4\x00\x00\x00\x05\x02\x06\x0f\x02\x05\x15\xba\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x04\x01\x00\x00\x00\x00\x00\x00\x00\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x00\x14\x00\x00\x00\x00\x00\x00\x04\x07\x02\x07\x07\x05\x05\x06\x07\x01\x08\x06\r\x08\x02\x05\x00\x08\x05\x02\x04\x0f\x02\x03\x15u\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
#cmd = b'\x03\x00e\x84yQ\x81h#\x01\x03\x01\xe0\xd1\x96\xc8t\xb3R\xa1\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x10\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x00\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x06\x05\x02\x06\x0f\x02\x03\x15<\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x01\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x06\x05\x02\x06\x0f\x02\x03\x15q\x00\x00\x00\x03\x05@\x00\x00\x00\x00\x00\x00\x00\x03\x06\x08\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x03\x07\x00\x10\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\x07\n\x05\x07\x04\x03\x08\x00\x12\x00\x00\x00\x00\x00\x00\x04\n\x04\x07\n\x06\x05\x08\n\x05\x08\x03\x03\t\x00\x14\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\t\n\x05\t\x03\x01\n\x07\x01\x0b\x08\x01\x0c\t\n\n\x0b\x0c\x0c\n\x02\x0c\t\x05\x04\x06\x0f\x04\x05\x15\xce\x00\x00\x00\x05\x03\x06\x0f\x03\x05\x15\xc4\x00\x00\x00\x05\x02\x06\x0f\x02\x05\x15\xba\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x04\x01\x00\x00\x00\x00\x00\x00\x00\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x00\x14\x00\x00\x00\x00\x00\x00\x04\x07\x02\x07\x07\x05\x05\x06\x07\x01\x08\x06\r\x08\x02\x05\x00\x08\x05\x02\x04\x0f\x02\x03\x15u\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
#cmd = b'\x03\x00Q\x16\x94\x87Y\x16\x16\x16\x03\x01\xa0\xb6\xc5\xe3\xf2\x19}\x84\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x10\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x00\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x06\x05\x02\x06\x0f\x02\x03\x15<\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x01\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x06\x05\x02\x06\x0f\x02\x03\x15q\x00\x00\x00\x03\x05@\x00\x00\x00\x00\x00\x00\x00\x03\x06\x08\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x03\x07\x00\x10\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\x07\n\x05\x07\x04\x03\x08\x00\x12\x00\x00\x00\x00\x00\x00\x04\n\x04\x07\n\x06\x05\x08\n\x05\x08\x03\x03\t\x00\x14\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\t\n\x05\t\x03\x01\n\x07\x01\x0b\x08\x01\x0c\t\n\n\x0b\x0c\x0c\n\x02\x0c\t\x05\x04\x06\x0f\x04\x05\x15\xce\x00\x00\x00\x05\x03\x06\x0f\x03\x05\x15\xc4\x00\x00\x00\x05\x02\x06\x0f\x02\x05\x15\xba\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x04\x01\x00\x00\x00\x00\x00\x00\x00\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x00\x14\x00\x00\x00\x00\x00\x00\x04\x07\x02\x07\x07\x05\x05\x06\x07\x01\x08\x06\r\x08\x02\x05\x00\x08\x05\x02\x04\x0f\x02\x03\x15u\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
#cmd = b'\x03\x00ca\x84FF\x132!\x03\x01l\x81/]:{L\x9e\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x10\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x00\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x06\x05\x02\x06\x0f\x02\x03\x15<\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x01\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x06\x05\x02\x06\x0f\x02\x03\x15q\x00\x00\x00\x03\x05@\x00\x00\x00\x00\x00\x00\x00\x03\x06\x08\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x03\x07\x00\x10\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\x07\n\x05\x07\x04\x03\x08\x00\x12\x00\x00\x00\x00\x00\x00\x04\n\x04\x07\n\x06\x05\x08\n\x05\x08\x03\x03\t\x00\x14\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\t\n\x05\t\x03\x01\n\x07\x01\x0b\x08\x01\x0c\t\n\n\x0b\x0c\x0c\n\x02\x0c\t\x05\x04\x06\x0f\x04\x05\x15\xce\x00\x00\x00\x05\x03\x06\x0f\x03\x05\x15\xc4\x00\x00\x00\x05\x02\x06\x0f\x02\x05\x15\xba\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x04\x01\x00\x00\x00\x00\x00\x00\x00\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x00\x14\x00\x00\x00\x00\x00\x00\x04\x07\x02\x07\x07\x05\x05\x06\x07\x01\x08\x06\r\x08\x02\x05\x00\x08\x05\x02\x04\x0f\x02\x03\x15u\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
cmd = b'\x03\x00\xac\xac\xac\xac\xac\xac\xac!\x03\x01lQ/J\xe9\xb3\xd8\xc7\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x10\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x00\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x06\x05\x02\x06\x0f\x02\x03\x15<\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\n\x06\x01\x02\x06\x04\x05\x04\x05\x03\x06\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x06\x05\x02\x06\x0f\x02\x03\x15q\x00\x00\x00\x03\x05@\x00\x00\x00\x00\x00\x00\x00\x03\x06\x08\x00\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x03\x07\x00\x10\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\x07\n\x05\x07\x04\x03\x08\x00\x12\x00\x00\x00\x00\x00\x00\x04\n\x04\x07\n\x06\x05\x08\n\x05\x08\x03\x03\t\x00\x14\x00\x00\x00\x00\x00\x00\x04\n\x02\x07\n\x06\x05\t\n\x05\t\x03\x01\n\x07\x01\x0b\x08\x01\x0c\t\n\n\x0b\x0c\x0c\n\x02\x0c\t\x05\x04\x06\x0f\x04\x05\x15\xce\x00\x00\x00\x05\x03\x06\x0f\x03\x05\x15\xc4\x00\x00\x00\x05\x02\x06\x0f\x02\x05\x15\xba\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03@\x00\x00\x00\x00\x00\x00\x00\x03\x04\x01\x00\x00\x00\x00\x00\x00\x00\x03\x05\x08\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x06\x00\x14\x00\x00\x00\x00\x00\x00\x04\x07\x02\x07\x07\x05\x05\x06\x07\x01\x08\x06\r\x08\x02\x05\x00\x08\x05\x02\x04\x0f\x02\x03\x15u\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

pc = 0

def parse(cmd):
    global pc

    while True:
        print(hex(pc)[2:].ljust(4, " "), ":", end=" ")
        opcode = cmd[pc]

        if cmd[pc] == 3:
            parse_3(cmd)
        elif cmd[pc] == 10:
            parse_10(cmd)
        elif cmd[pc] == 2:
            parse_2(cmd)
        elif cmd[pc] == 5:
            parse_5(cmd)
        elif cmd[pc] == 14:
            parse_14(cmd)
        elif cmd[pc] == 15:
            parse_15(cmd)
        elif cmd[pc] == 0x15:
            parse_21(cmd)
        elif opcode == 4:
            parse_4(cmd)
        elif opcode == 7:
            parse_7(cmd)
        elif opcode == 1:
            parse_1(cmd)
        elif opcode == 12:
            parse_12(cmd)
        elif opcode ==13:
            parse_13(cmd)
        else:
            break

def parse_3(cmd):
    global pc
    print(f"data[{cmd[pc+1]}]", "=", hex(int.from_bytes(cmd[pc+2:pc+10], "little")))
    pc += 10

def parse_10(cmd):
    global pc
    print(f"data[{cmd[pc+1]}]", "&=", f"data[{cmd[pc+2]}]")
    pc += 3

def parse_2(cmd):
    global pc
    print(f"cmd[data[{cmd[pc+2]}]]", "=", f"data[{cmd[pc+1]}]")
    pc += 3

def parse_5(cmd):
    global pc
    print(f"data[{cmd[pc+1]}]", "+=", f"data[{cmd[pc+2]}]")
    pc += 3

def parse_14(cmd):
    global pc
    print(f"data[{cmd[pc+1]}] >>= data[{cmd[pc+2]}]")
    pc += 3

def parse_15(cmd):
    global pc
    print(f"reg cmp data[{cmd[pc+1]}], data[{cmd[pc+2]}]")
    pc += 3

def parse_21(cmd):
    global pc
    tmp = hex(int.from_bytes(cmd[pc+1:pc+5], "little"))
    print(f"if reg == 2; jmp {tmp}")
    pc += 5

def parse_4(cmd):
    global pc
    print(f"data[{cmd[pc+1]}] = data[{cmd[pc+2]}]")
    pc += 3

def parse_7(cmd):
    global pc
    print(f"data[{cmd[pc+1]}] *= data[{cmd[pc+2]}]; reg = data[{cmd[pc+1]}] == 0")
    pc += 3

def parse_1(cmd):
    global pc
    print(f"data[{cmd[pc+1]}] = bswap(cmd[data[{cmd[pc+2]}]])")
    pc += 3

def parse_12(cmd):
    global pc
    print(f"data[{cmd[pc+1]}] ^= data[{cmd[pc+2]}]; set reg")
    pc += 3

def parse_13(cmd):
    global pc
    print(f"data[{cmd[pc+1]}] <<= data[{cmd[pc+2]}]; set reg")
    pc += 3

parse(cmd)

이후 솔버를 짜주었다.

from sage.all import *

cmp = [0x423614475C1EDAEA, 0x40A5ECE5DD1BE9D9, 0x5A2E91FFDBF28E04, 0x2FE4CA52A1BBBE26]
table = [0xa152b374c896d1e0, 0x847d19f2e3c5b6a0, 0x9e4c7b3a5d2f816c, 0xc7d8b3e94a2f516c]

for aaa in range(4):
    table_l = []
    cmp_l = []

    for i in range(64):
        table_l.append(table[aaa] & 1)
        table[aaa] >>= 1
        cmp_l.append(cmp[aaa] & 1)
        cmp[aaa] >>= 1

    mat_table = []
    mat_cmp = []
    for i in range(8):
        mat_table.append(table_l[8*i:8*(i+1)])
        mat_cmp.append(cmp_l[8*i:8*(i+1)])

    A = Matrix(Zmod(2), mat_table)
    B = Matrix(Zmod(2), mat_cmp)

    f = A.solve_left(B)

    res = 0
    for i in range(8):
        for j in range(8):
            res += ZZ(f[i, j]) << (8 * i + j)

    print(hex(res))

flag: lguplus2024{f5e5270619eca8cae1972b7641adbdb2ee8bc5f1ec81475c04d747a927b9e709}