
- 복잡한 비트 연산과 메모리 복사 패턴에서 패커를 의심할 수 있다. v4가 참조하는 byte_410015의 주소를 확인할 결과 UPX1 세그먼트 이름을 발견할 수 있었다.

- 압축해제한 파일을 IDA에서 확인해보면 다음과 같은 읽기 쉬운 로직을 확인할 수 있다.

- 검증에 이용되는
andandand 함수를 살펴보면 입력값의 각 문자와 'MSGCTF'의 해당 문자를 XOR 연산한 결과가 targets 배열의 값과 같은지 검증하고 있다.


targets에 담겨있는 값과 'MSGCTF'를 XOR 연산하여 원본 플래그를 구하는 코드를 돌려보면 flag를 획득할 수 있다.
v2 = [ord('M'), ord('S'), ord('G'), ord('C'), ord('T'), ord('F')]
targets = [
[0x1A, 0x28, 0x7C, 0x2E],
[0x3C, 0x3E, 0x36, 0x0C],
[0x33, 0x77, 0x18, 0x05],
[0x2A, 0x37, 0x1C, 0x11],
[0x31, 0x22, 0x0B, 0x13],
[0x33, 0x3F, 0x73, 0x67]
]
flag = ""
for c in range(6):
for i in range(4):
flag += chr(v2[c] ^ targets[c][i])
print(f"MSG{{{flag}}}")
# MSG{We1come_t0_Bit_Rev_Guy5!}

- 프로그램을 실행시켜 falg가 출력되는 것을 확인하였다.