Reversing/barcode
- 입력된 16진수를 8바이트(64비트) 단위로 읽고
- XOR 연산을 수행한 후
- 각 64비트를 비트 단위로 분해해서 0/1 배열로 변환
- 1은 '*'로, 0은 ' '로 출력
def convert_line_to_byte_value(line):
byte = 0
for i in range(8):
if i < len(line) and line[i] == '*':
byte |= (1 << i)
return byte
# flag.barcode 파일 내용 읽기
with open('flag.barcode', 'r', encoding='utf-8') as f:
lines = f.read().splitlines()
# 각 문자 패턴 추출
characters = []
for i in range(0, len(lines), 8):
if i + 7 < len(lines):
characters.append(lines[i:i+7])
# 각 문자를 64비트 값으로 변환
values = []
for idx, char in enumerate(characters):
value = 0
for j in range(7):
byte = convert_line_to_byte_value(char[j])
value |= byte << (j * 8)
values.append(value)
print(f"문자 {idx + 1} 값: 0x{value:016x}")
# 역연산 수행
input_values = [0] * len(values)
input_values[0] = values[0]
mask = 0xFFFFFFFFFFFFFFFF
for i in range(1, len(values)):
input_values[i] = (~values[i] & mask) ^ input_values[i - 1]
print("\n역연산 결과:")
for i, v in enumerate(input_values):
print(f"문자 {i + 1} 입력값: 0x{v:016x}")
# 최종 입력값
final_hex = ''.join(f"{v:016x}" for v in input_values)
print("\n최종 입력값:")
print(f"0x{final_hex}")
Result
문자 1 값: 0x000202027e027e00
문자 2 값: 0x007e020202020200
문자 3 값: 0x004242427e423c00
문자 4 값: 0x003c427202423c00
역연산 결과:
문자 1 입력값: 0x000202027e027e00
문자 2 입력값: 0xff83ffff83ff83ff
문자 3 입력값: 0x003e424202424000
문자 4 입력값: 0xfffdffcfffff83ff
최종 입력값:
0x000202027e027e00ff83ffff83ff83ff003e424202424000fffdffcfffff83ff
FLAG{0x000202027e027e00ff83ffff83ff83ff003e424202424000fffdffcfffff83ff}
'해킹 > CTF Write-Ups' 카테고리의 다른 글
HACKTHEON SEJONG 2025 Finals Write-up (1) | 2025.07.15 |
---|---|
DEF CON CTF Qualifier 2025 Write-Up (0) | 2025.04.14 |
R3CTF/YUANHENGCTF 2024 Write-Up (1) | 2024.06.11 |
N0PSctf 2024 Write-Up (0) | 2024.06.03 |
[WolvCTF Write-up] child-re (0) | 2023.04.10 |