본문 바로가기

정보보호

[Practical Car Hacking CTF Teaser] "Volkswagen CAN Checksum" Write-up

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

  1. 문제에서 주어진 값(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
  1. 구한 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)}")
반응형

'정보보호' 카테고리의 다른 글