728x90
반응형
이 문제는 CRC Checksum에 대한 문제입니다. 문제 및 자세한 설명은 아래 링크를 참고하시기 바랍니다.
https://ctf-teaser.icanhack.nl/challenges#Volkswagen%20CAN%20Checksum-1
문제를 한번 풀어보신 후, 아래 풀이를 보시기 바랍니다. 스포일러 방지를 위해, 아래에서 풀이하겠습니다.
문제는 총 3단계로 나누어 풀어볼 수 있습니다.
1. 문제에서 주어진 문서의 Table 7.3을 통해, mkCrcFun() 함수에 들어갈 파라미터 값을 구할 수 있습니다.
https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_SWS_CRCLibrary.pdf
- 문제에서 주어진 값(Logged Message)을 통해 secret_byte를 구할 수 있었습니다.
이는 payload가 0x010000 증가하는데, secret_byte 값은 동일한 0xC3 값을 유지하고 있습니다. 즉, 구하려는 Payload인 0x0f0300의 secret_byte 값도 0xC3임을 유추할 수 있습니다. 아래와 같은 코드를 이용해, secret_byte를 구했습니다.
import crcmod
# The value of polynomial and initial_value are provided in AUTOSAR specification (Specification of CRC Routines)
polynomial = 0x2F
initial_value = 0xFF
crc = crcmod.mkCrcFun(
poly=0x100 + polynomial,
initCrc=initial_value,
rev=False,
xorOut=0x00
)
payload = b'\x03\x03\x00'
checksum = b'\x84'
for b in range(256):
secret_byte = bytes([b])
data = payload + secret_byte
calc_crc = crc(data) ^ 0xFF
if calc_crc == checksum[0]:
print(f"secret_byte: {hex(b)}")
break
- 구한 secret_byte 로 CRC 값을 구했습니다. 구하고자 하는 값은 앞의 두자리 (CRC Checksum 값) 이므로 Flag 값을 구할 수 있습니다. CRC 값은 아래 코드와 같이 구했습니다.
import crcmod
crc = crcmod.mkCrcFun(
poly=0x100 + polynomial,
initCrc=initial_value,
rev=False,
xorOut=0x00
)
payload = b'\x0f\x03\x00'
secret_byte = 0xc3
data = payload + secret_byte
checksum = crc(data) ^ 0xff
print(f"CRC = {hex(checksum)}")
반응형
'정보보호' 카테고리의 다른 글
정보보호 컨퍼런스 순위 정리 (2) | 2024.11.01 |
---|