LG Uplus 2024 Final
Dec 6, 2024
»
CTF
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}