https://joondong.tistory.com/6

 

3. 초기 설정 (1) CAN_BTR (CAN bit timing register)

CAN 프로토콜도 다른 통신 프로토콜과 마찬가지로 여러가지 전송 옵션을 규정하고 있습니다. 따라서 CAN 컨트롤러가 송수신을 시작하기 전에 어떻게 송수신할 지 미리 설정해 두어야 합니다. 전

joondong.tistory.com

 

CAN 프로토콜도 다른 통신 프로토콜과 마찬가지로 여러가지 전송 옵션을 규정하고 있습니다. 따라서 CAN 컨트롤러가 송수신을 시작하기 전에 어떻게 송수신할 지 미리 설정해 두어야 합니다.

 

전송 옵션은 CAN_MCR과 CAN_BTR에서 설정할 수 있습니다. 이 두 레지스터에 대한 설명은 CAN 레퍼런스 매뉴얼에 나와있지만 좀 더 전체적인 관점에서 이해할 수 있도록 레지스터의 비트필드의 기능을 간단히 설명한 다음에 CAN 프로토콜, 제가 알고있는 것을 약간 섞어서 다시 설명해 보겠습니다.

  • BRP (Baud rate prescaler)
    : CAN 컨트롤러에 공급되는 PCLK를 분주하여 타임 퀀텀 주기를 설정합니다.
  • TS1/2 (Time segment 1/2)
    비트 세그먼트1/2에 배정할 타임 퀀텀의 개수를 정의합니다. 즉, 비트 세그먼트1/2의 주기를 결정합니다.
  • SJW (Resynchronization jump width)
    : CAN 컨트롤러는 비트 세그먼트1의 주기를 늘리고 비트 세그먼트2의 길이를 줄이는 방식으로 재동기화를 수행하는데, 이때 늘리고 줄일 시간의 길이를 타임 퀀텀 단위로 정의하는 필드입니다.
※ 참고로 주기는 시간과 동일한 의미로 이해하면 됩니다.
 
주의할 것은 타임 퀀텀이 버스상 1비트의 주기가 아니라는 것입니다. 이것은 CAN 통신이 비동기식 통신이기 때문에 네트워크 안에서 각 노드가 개별적으로 동기를 맞춰 나가는 과정과 관련있습니다. CAN 컨트롤러는 버스상 1비트를 4개의 세그먼트로 구성하고, 다시 그 세그먼트를 몇 개의 타임 퀀텀으로 구성합니다. 하지만 타임 퀀텀은 CAN 컨트롤러 내부에서 연산되기 때문에 오실로스코프로 관찰할 수 없습니다. 타임 퀀텀은 BRP에 의해 결정되는 가장 작은 시간 단위로 TS1과 TS2를 사용하여 세그먼트에 타임 퀀텀이 몇 개를 배정하느냐에 따라 각 세그먼트의 주기가 달라지고, 나아가 전체 1비트의 주기가 달라집니다. 즉, 동일한 프리스칼라를 설정해도 각 세그먼트에 배정된 타임 퀀텀의 개수에 따라 1비트의 주기가 달라질 수 있다는 의미입니다. CAN 버스상의 각 노드는 서로 다른 길이의 타임 퀀텀을 가질 수는 있지만, 타임 퀀텀으로 구성되는 1비트의 주기는 모든 노드가 같아야 합니다. 즉, CAN 버스상의 모든 노드의 전송 속도는 동일해야 합니다.
 
4개의 세그먼트는 다음과 같습니다.
  • SYNC_SEG
    : 각 비트의 하강 엣지가 이 SYNC_SEG 안에 들어 있는지의 여부로 동기를 판정합니다. (무조건 1 타임 퀀텀, 설정 불가, 나머지 세그먼트는 설정 가능)
  • PROP_SEG
    : 네트워크의 물리적 지연시간을 보정하기 위해 사용됩니다. 1~8 타임 퀀텀
  • PHASE_SEG 1
    : 위상 오류(위상차)를 보정하기 위해 사용됩니다. (1~8 타임 퀀텀)
  • PHASE_SEG 2
    : 위상 오류(위상차)를 보정하기 위해 사용됩니다. (PHASE_SEG 1의 최대값(8) + 정보처리시간(<= 2타임 퀀텀))
※ STM32에서는 PROP_SEG와 PHASE_SEG 1을 합쳐서 비트 세그먼트 1로 정의합니다.
 
※ STM32에서는 PHASE_SEG 2는 비트 세그먼트 2로 정의합니다.
 
※ 위에 있는 타임 퀀텀의 범위는 각 세그먼트에 대한 가능한 타임 퀀텀입니다. 하지만 두개의 보드에서 동일한 설정을 해도 트랜시버에 따라 어떤 보드는 송신을 하고 어떤 보드는 송신을 못해서 어떻게 정해야 하는지는 잘 모르겠습니다. 그리고 STM32는 PROP_SEG 세그먼트와 PHASE_SEG 1 세그먼트가 비트 세그먼트 1로 정의하고 사용하는데 이 비트 세그먼트의 비트를 조절할 때 PROP_SEG 세그먼트와 PHASE_SEG 1 세그먼트의 비율이 어떻게 되는지도 잘 모르겠습니다..
 

제가 사용한 설정은 48MHz MCU 속도에서 아래 두개 입니다.

프리스칼라   1024  2
 BS1  3  15
 BS2  5  8
 SJW  1  1
 비트타임/속도  192000ns/5208bps  1000ns/1Mbps

 

※ 저는 위상이라는 개념을 어떤 동일한 신호에 대해 어떤 개체가 인식하는 신호의 발생 시점이라고 이해하고 있습니다. 따라서 위상차란 두개 이상의 개체가 인식하는 어떤 신호의 시작 시점의 차이라고 알고 있습니다. 여기서 개체는 회로에서 어떤 부품이 될 수도 있고, 회로에서의 어떤 위치도 될 수 있습니다. 만약 틀렸다면 지적 부탁드립니다.

 

※ 그리고 주의할 점은 1비트는 어떤 세그먼트를 길게하든 짧게하든 최소 8타임 퀀텀에서 최대 25타임 퀀텀으로 구성되어야 합니다. 처음에 뭣도모르고 PHASE_SEG1/2를 1타임 퀀텀으로 해서 테스트해봤는데 통신이 되지 않았습니다. 타임 퀀텀과 세그먼트는 오실로스코프로 관찰할 수 없었지만, PHASE_SEG1/2를 1타임 퀀텀으로 설정하여 1비트가 3타임 퀀텀인 상태에서 위상차가 발생하면 SJW(최소 1타임 퀀텀)만큼 늘리거나 줄이게 되는데, 최소값인 1타임 퀀텀 조차도 3타임 퀀텀에 비해 너무 길어서 그런게 아닌가 추측해봅니다. 즉, 오차를 조정했는데 너무 많이 조정해서 또 다른 오차가 발생하게 되는 것입니다.

 

STM32 CAN 컨트롤러에서 세그먼트들은 1비트에서 다음과 같이 할당됩니다.

CAN RX를 사용한 이유는 앞서 설명했듯이 CAN TX에 따라 달라지는 CAN Low, CAN High 신호가 AND 게이트를 거쳐 CAN 컨트롤러와 연결된 CAN RX로 출력되면, CAN 컨트롤러가 이 신호로 버스의 상태를 모니터링하기 때문입니다. 위의 예에서 RXD는 Logic High 1비트를 출력한 후 Logic Low로 전환하고 있습니다. CAN 컨트롤러는 CAN RX 기준으로 하강 엣지(리세시브->도미넌트)가 SYNC_SEG 안에 있는지의 여부로 동기를 판정합니다. ‘전송’ 파트에서 자세히 설명하겠지만, 버스상의 어떤 노드도 신호를 보내고 있지 않은 상태(리세시브)에서 어떤 노드가 데이터 프레임을 전송하면 전송을 시작한다는 의미로 SOF 신호를 보내게 되는데 이 SOF 신호는 도미넌트 신호 입니다. 이때 CAN RX에서 하강 엣지를 탐지하게 되고 버스상의 모든 노드는 SOF 신호에 SYNC_SEG를 맞춥니다. 이때는 버스상의 모든 노드가 동기화된 상태입니다. (참고로 버스 프리 상태에서는 비트를 세그먼트로 나누어 동기를 잡지 않습니다.) 하지만 SPI 통신처럼 동기를 잡아주는 클록이 따로 없고, 신호선의 길이와 노드들의 상대적인 위치 때문에 오차가 누적되어 하강 엣지가 SYNC_SEG 밖에서 탐지되는 상황이 발생합니다. 이때 하강 엣지가 비트 세그먼트2에서 탐지되면 비트 세그먼트2의 타임 퀀텀 개수에서 SJW에서 설정한 타임 퀀텀의 개수를 빼주어 비트 세그먼트2의 주기를 줄이고, 하강 엣지가 비트 세그먼트1에서 탐지되면 비트 세그먼트1의 타임 퀀텀 개수에서 SJW에서 설정한 타임 퀀텀의 개수를 더하여 비트 세그먼트1의 주기를 늘리는 방식으로 오차를 조정합니다.

참고로 STM32 레퍼런스 매뉴얼(RM0091 837페이지)에선 비트를 판정하는 유효한 엣지를 다음과 같이 정의하고 있습니다.

A valid edge is defined as the first transition in a bit time from dominant to recessive bus level provided the controller itself does not send a recessive bit.

 

‘컨트롤러가 리세시브 비트를 보내고 있지 않다면, 유효한 엣지는 1비트 타임 안에서 도미넌트부터 리세시브 버스 레벨까지의 첫번째 전환으로 정의된다.’ 정도로 해석될 수 있는데요. 이렇게 되면 비트를 판정하는 엣지가 상승 엣지가 되어버립니다. 하지만 어떤 CAN 문서를 찾아봐도 상승 엣지에서 비트를 판정한다는 내용을 찾을 수 없었습니다. 따라서 dominant와 recessive의 위치가 바뀌어야 할 것 같습니다. 아마 레퍼런스 매뉴얼 작성자의 실수라고 생각되지만 다른 의견이 있으면 말씀해주세요.

블로그 이미지

wtdsoul

,

AUTOSAR CAN 통신 스택 : AUTOS.. : 네이버블로그 (naver.com)

 

AUTOSAR CAN 통신 스택 : AUTOSAR 개발을 위해 반드시 알아야하는 계층형 구조

AUTOSAR CAN 통신 스택: BSW 개발을 위해 반드시 알아야하는 계층형 구조 하드웨어에 독립적(...

blog.naver.com

 

AUTOSAR CAN 통신 스택: BSW 개발을 위해 반드시 알아야하는 계층형 구조

하드웨어에 독립적(#hardware-independent)인 #소프트웨어플랫폼 구축을 위해서 많은 플랫폼들이 #계층형구조 를 도입하여 하위에는 하드웨어 종속적인 모듈들을 배치하고 상위로 갈수록 하드웨어에 독립적인 구조가 될 수 있도록 계층과 모듈들을 구성합니다. #AUTOSAR 도 계층형 구조로 되어있어서 하드웨어에 독립적인 어플리케이션 작성이 가능하지만, 더 정확한 구현과 효과적인 디버깅을 위해서 내부의 계층을 잘 이해할 필요가 있습니다. 특히, #어플리케이션소프트웨어(#ASW)가 아니라 #베이직소프트웨어(#BSW)를 개발하는 입장이라면 계층 간 메시지 전달에 대해서 이해하는 것은 꼭 필요한 일이라고 할 수 있습니다. 

이 글에서는 AUTOSAR #CAN통신스택을 살펴보고 메시지 전달 과정과 #CAN통신과 관계된 모듈들을 알아보도록 하겠습니다.

 

통신DB import

통신 모듈들을 설정하기 위해서는 ARXML형태로 구성된 통신 데이터가 필요하기 때문에 모듈 설정에 앞서 ECU에서 사용할 통신 데이터를 import 하게 됩니다. 대부분의 AUTOSAR 솔루션들이 통신 DB를 간편하게 import해서 AUTOSAR 데이터 포맷으로 변환해주는 기능을 갖고 있습니다. 예를 들면 현대오트론에서 개발한 모빌진(mobilgene)도 ARXML파일뿐 아니라, CAN/LIN/Flexray/Ethernet등의 데이터베이스 혹은 엑셀 형식으로 저장된 파일을 drag-drop방식으로 끌어와서 간편하게 AUTOSAR ARXML 형태로 만들어 주는 기능을 제공할 뿐만 아니라, import한 데이터를 모듈들의 의존성을 고려해서 자동으로 설정해주는 기능까지 제공하고 있습니다. 다음 그림은 AUTOSAR 협회 사이트에 공개된 현대오트론 모빌진(mobilgene)의 CAN 관련 설명이니 참고하시기 바랍니다.

[그림 1] 현대오트론 mobilgene의 Import Network Design 방법(출처: 현대오트론)

[그림 2] 현대오트론 mobilgene의 CAN 통신 예시(출처: 현대오트론)

 

 

CAN 통신스택(Communication Stack)

다음 그림은 통신서비스 제공을 위해 AUTOSAR에서 정의하는 모듈들을 서로 다른 색으로 표현된 계층에(MCU 추상화 계층-빨간색, ECU 추상화 계층-초록색, 서비스 계층-파란색) 나누어 표현한 것으로 계층의 특성에 맞춰 통신 관련 모듈들이 분포되어 있는 것을 알 수 있습니다. 그림의 점선 부분은 적용되는 통신 버스에 따라서 LIN, FlexRay, J1939, XCP, CAN, Ethernet 등이 될 수 있습니다.

[그림 3] AUTOSAR에서 정의하는 모듈 계층

CAN 통신 스택은 기능/역할별로 다음의 세 가지 영역으로 나누어 볼 수 있겠습니다. 

1. PDU 송/수신 관련 기능

: CAN 메시지를 송수신 하는 과정에서 PDU 전달과 관련된 기능을 수행하는 모듈들을 포함하고 있습니다. 

2. 통신 상태 제어기능

: 통신 상태를 변경하거나, 이상이 발생했을 때 이에 대한 처리를 담당하는 모듈들을 포함합니다. 

3. 네트워크 관리 기능

: 통신 네트워크를 관리하기 위한 모듈들이 포함되어 있습니다. 

 

[그림 4] CAN 통신 스택의 세 가지 기능

이 글에서는 위에서 언급한 세 가지 중 PDU 송/수신에 관여되는 통신 관련 주요 모듈들을 살펴보고, 통신 스택을 구성하는 모듈 간 PDU 흐름을 살펴보도록 하겠습니다.

 

COM 모듈

통신 스택은 일반적인 CAN통신의 송/수신 기능에 관여하는 모듈들(다음 그림 참고: Com, PduR, CanIf, CAN)로 구성됩니다. COM 모듈을 기점으로 상위 layer는 signal을 사용하고, 하위로는 PDU를 사용합니다. Signal은 전달할 메시지, PDU는 계층 간 메시지 전송을 위한 프로토콜 추상화로 생각할 수 있습니다. 어플리케이션에서 전달된 signal 은, COM의 I-PDU 버퍼에 저장되고 PduR_ComTransmit 함수에 의해서 I-PDU 형태로 PduR로 전달됩니다. 반대로 PDU를 수신 받을 때는 PduR에서 Com_RxIndication 함수를 통해서 수신된 PDU가 있음을 알리고, COM에서는 I-PDU 속 signal을 분석해서 해당 signal과 연결된 callback 함수를 호출하여 수신된 signal이 RTE를 통해서 어플리케이션으로 전달됩니다.

[그림 5] Signal/PDU 사이 변경을 위해서 COM 모듈에는 각 signal과 PDU가 정의되어 있는데, 간혹 참조 관계가 틀렸거나 존재하지 않는 경우가 있습니다. AUTOSAR BSW 개발 소프트웨어 DB import 시 자동으로 설정해 줘야 하지만, import과정에서 type 설정을 잘못했거나, 혹은 의존관계 모듈의 버전 문제 등 여러 가지 원인으로 정상적인 설정이 안되는 경우가 있습니다. 이런 경우 직접 확인해서 해당 문제를 수정해 줘야 합니다.

 

 

PDU(Protocol Data Unit)

통신 메세지는 네트워크 계층 간 정보 전달의 편의를 위해서 PDU로 바뀌는데 SDU(Service Data Unit)와 PCI(Protocol Control Information)로 구성됩니다. SDU는 다른 계층 또는 모듈로 전달되는 데이터이고, PCI는 발신지/수신지/순서 번호와 같은 정보들로 계층 간 혹은 모듈 간 PDU 전달을 위해 덧붙이는 정보를 말합니다. 예를 들어 COM에서 전달받은 PDU는 PduR에서는 SDU가 되고, 라우팅 정보가 포함된 PCI가 더해져서 새로운 PDU를 구성하게 됩니다. 아래 그림은 다음 계층의 PCI 정보가 덧붙여 지면서 PDU가 계층 간 전달되는 것을 설명하고 있습니다.

 
[그림 6] 이렇게 하위 계층으로 이동하면서 PDU는 상위계층에서 만들어진 SDU와 PCI를 헤더에 붙여가는 방식으로 PDU가 지나온 전체 경로를 기억하게 됩니다.

[그림 7] 계층별로 주고받는 정보가 다르기 때문에 다음 그림처럼 계층에 따라 PDU에 붙는 prefix도 달라집니다.

PDU는 AUTOSAR의 CAN 스택 내에서만 사용되는 것이기 때문에 CAN Driver를 통해서실제 전송시에는 PDU형태로 전송되지 않고, 필요한 메시지만 PDU에서 추출하여 네트워크로 전송하게 됩니다.

 

PduR 모듈

COM에서 만들어진 PDU는 PduR(PDU Router)로 전달되어 Routing table을 참고해서 해당 PDU를 전달할 목적지를 설정하는 방식으로 PDU를 목적지로 전송하게 됩니다. PduR모듈은 routing table과 engine으로 구성되는데, Routing table은 각 PDU들의 경로 정보를 가지고 있어서, 여기에 기록되지 않은 PDU는 정상적으로 전달되지 않습니다. Engine은 routing table을 사용해서 PDU가 올바른 경로로 전달될 수 있도록 해주는데, 주요하게는 PDU가 위로 전달되는지 혹은 아래로 전달되는지에 따라서 PDU ID와 API를 연결하여 호출해 주는 기능입니다.

[그림 8] PduR 모듈

PduR의 Gateway 기능을 통해서 서로 다른 Bus간 혹은 서로 다른 Controller간 PDU 송/수신도 가능합니다.

 

간혹 DB Import 과정에서 Multicast 설정이나 Gateway 설정에 해당하는 메시지가 정상적으로 세팅되지 못하거나 그 밖에 다양한 원인으로 PduR에 설정되어야 하는 Gateway가 설정되지 않는 경우가 있습니다. 코드생성 자체가 안되는 경우도 있고, 혹은 나중에 테스트 과정에서 해당 기능이 누락되는 경우도 있습니다. 특히, Gateway 설정이 정상적이지 않은 경우가 빈번합니다.

[그림 9] PduR을 기준으로 상위는 Bus나 Controller에 의존성이 없지만,

하위부터는 특정 Bus나 Controller에 의존성을 갖게 됩니다.

CanIf 모듈

CanIf 모듈에서는 PDU ID를 확인해서 내부의 Channel을 선택합니다. 각 Channel에 연결된 HOH(Hardware Object Handle)에 PDU를 전달하면, CAN controller의 Hardware Object에 해당 PDU를 write 하고, object flag 값을 1로 설정되면 Transceiver에 의해서 Can frame이 전달됩니다.

 

[그림 10] CanIf 모듈

지금까지 설명한 Can 통신 스택의 4가지 주요 모듈을 정리하면 다음과 같습니다. 

COM
- PDU data를 signal 단위로 읽고 쓸 수 있는 interface 제공
- 주기적으로 PDU 송신
- Signal에 대한 timeout, data received, data send 등의 이벤트를 ASW에 통지
PduR
- Routing table에 설정된 PDU reference를 참조하여 source 및 destination 모듈 간에 pdu를 전달
CanIF
- Can driver로부터 수신한 PDU를 상위 layer로 전달
- 상위 layer가 송신한 PDU를 can driver로 전달
- Can controller 및 transceiver를 제어하는 interface 제공
- Bus off 발생을 Can으로부터 받아 CanSM에 전달
CAN
- Can controller의 활성화 및 비활성화 제어
- Can interrupt handler를 제공(Tx, Rx, Busoff 등): interrupt 대신 주기 task를 이용한 Polling 방식도 사용 가능

 

마지막으로, 다음 그림은 CAN 메시지 송신 시 모듈 간 호출되는 API 및 Callback 함수를 정리한 것입니다. 함수명은 환경에 따라 다소 다를 수 있지만, 앞에서 살펴본 CAN 통신 스택의 함수 호출 예로 참고하시기 바랍니다. 

[그림 11] CAN 메시지 송신 시 모듈 간 호출되는 API 및 Callback 함수 정리

① RTE API를 통해서 전달할 signal이 COM에 도착하면 COM은 signal을 PDU로 변환하고, PduR로 해당 PDU를 전달하면서 전송 요청을 합니다. 

② PduR은 적절한 전송 모듈을(LIN, CAN, XCP등)을 선택해서 해당 모듈로 PDU를 보내서 전송 요청을 합니다. 

③ CanIf는 PDU ID를 확인해서 연결될 channel을 설정하고, 해당 채널을 통해서 Can driver의 HTH(Hardware Transmission Handle)로 전송하려는 메시지를 전달합니다. 

④ Can driver에서는 HTH에 연결된 Can controller의 Hardware Object에 전달할 메시지를 write하도록 합니다. 

 

블로그 이미지

wtdsoul

,

[AUTOSAR 시리즈] mobilgene C.. : 네이버블로그 (naver.com)

 

[AUTOSAR 시리즈] mobilgene Classic 기반 AUTOSAR 개발 가이드(1) : 통신 네트워크 설정(설명편)

mobilgene Classic 기반 AUTOSAR 개발 가이드 - (1) 통신 네트워크편 이번 포스팅에서는 AUTO...

blog.naver.com

 

 

 

블로그 이미지

wtdsoul

,

 

https://www.kisa.or.kr/post/fileDownload?menuSeq=2060205&postSeq=14&attachSeq=2&lang_type=KO&usg=AOvVaw0c1uUx1y2njSHclyVd9ral 

 

 

CSMS

블로그 이미지

wtdsoul

,

Hyundai Head Unit Hacking · random hacks (xakcop.com)

 

Hyundai Head Unit Hacking · random hacks

In the previous post I have shown how to crack the official firmware for Hyundai Tucson 2020 and reverse engineer it. At the end I was thinking that I can simply modify the update package, zip it again with the same password and push it to the car. But it

xakcop.com

 

In the previous post I have shown how to crack the official firmware for Hyundai Tucson 2020 and reverse engineer it. At the end I was thinking that I can simply modify the update package, zip it again with the same password and push it to the car. But it turned out it is not that simple. The update package is signed with an RSA key which corresponds to the daudio.x509.pem certificate and this signature is checked during the update. This is part of the Android OTA update process which is being used for updating the firmware of the entire unit (not just the car navigation). Unlike the RSA key for Ioniq 2021, this key cannot be found online (at least I haven’t found it). How can we get access to the head unit in this case? I was thinking either of these two options:

  • find an exploitable bug in one of the applications
  • find an exploitable bug in the Linux kernel; the head unit is running Linux 3.1.10, so this looked feasible

I had no luck with both of them. Fortunately, I found some new information which allowed me to root the head unit.

New findings

First and foremost, I realized that Hyundai is shipping the same firmware to a variety of cars. My car had the so called “Standard-class Gen5 navigation” which looks like this:

 

They call it “navigation” but it is basically the firmware of the entire head unit. The same firmware is shipped on different Hyundai, KIA and Genesis models manufactured in the 2018-2021 time frame.

The head unit is running on Telechips TCC893X SoC and its SDK has been leaked on the internet. There is a secret recovery mechanism which is triggered by holding the POWER button (left knob) and the MAP button upon start:

 

I tried it on my Hyundai Tucson 2020 and I got this nice error on the car screen:

 

Apparently the recovery mechanism is looking for some encrypted files on the USB drive. A simple grep for these strings leads to the lk.rom file from the update package which I have been ignoring until now. Let’s load it in Ghidra and see what’s going on.

Reversing lk.rom

LK stands for “little kernel”, a small open-source kernel which is used in many embedded platforms. The head unit is loading lk.rom at address 0x82000000. After setting the correct start address in Ghidra, we can easily identify printf functions which print a lot of useful debug info. Tracing the message "[DEBUG] U-Boot Recovery Button pushed .... \n" leads to:

 

Looks like the recovery mechanism is part of u-boot and its entry point is the function at 0x820589a8:

 

Using the debug message at line 14, we can easily infer that this function copies the u-boot code to 0x80000000 and starts it. PTR_DAT_82058a38 is the beginning address of u-boot and PTR_DAT_82058a3c is the end address:

 

Using these addresses, we can “extract” the u-boot code from lk.rom with the following command:

$ dd if=lk.rom skip=$((0x1055c)) count=$((0x57894-0x1055c)) bs=1 of=uboot.rom

And then analyze uboot.rom as a separate binary with start address 0x80000000 in Ghidra.

Reversing uboot.rom (part of lk.rom)

There are again many debug strings which help a lot to understand what’s going on. The recovery mechanism is looking for the following files on the USB drive:

  • security_force/encrypt_lk.rom
  • security_force/encrypt_boot.img
  • security_force/encrypt_system.img
  • security_force/encrypt_recovery.img
  • security_force/encrypt_splash.img
  • security_force/encrypt_partition.dat

There is also security_force/file_info which contains the name, size and CRC32 checksum for each of the above files. These files (with the exception of encrypt_partition.dat) correspond to the files we have found in the update package:

 

They must be encrypted with AES-128-CBC using key=”)1Zorxo^fAhGlh$#” and IV="aoAkfwk+#1.6G{dE”. Only system.ext4 must be converted to sparse image before the encryption.

Patching system.ext4

Assuming that we can flash whatever we want with the recovery mechanism, what would be the minimal patch for the official firmware which will give us some kind of access to the head unit? While looking for exploitable bugs in the stock applications, I found a hidden menu in the Engineering Mode which enables ADB:

 

The boolean flag mDispAdb can be switched by tapping 5 times in the bottom right corner of the 3rd page of “Module Info”. However, if ADB_HIDE_FEATURE is present this flag is ignored and visibility is always set to 8 which means GONE. The ADB_HIDE feature is set by default as we can see in system.ext4:

$ cat /tmp/car/etc/permissions/com.hkmc.software.engineermode.adb_hide.xml 
<permissions>
    <feature name="com.hkmc.software.engineermode.adb_hide" />
</permissions>

Well, let’s delete this feature, create a recovery package and push it to the car. Long story short, that worked! With this simple change we have successfully enabled ADB on Kia Stinger 2020 and connected to it over USB!

 

Getting root shell

Now when we have an ADB shell how to become root? Turns out there is a convenient setuid binary called “amossu” in the stock firmware:

$ ls -la bin/amossu
-rwsr-sr-x 1 root root 37216 Oct  6 08:29 bin/amossu

It simply does:

setgid(0);
setuid(0);
execv("/system/bin/sh",__argv);

Tooling

I have released a small tool and instructions how to create custom firmware for cars with Gen5 navigation. You can find it here. So far we have successfully verified the entire process on Kia Stringer 2020 (thanks to Ali Al-Rawi).

Final thoughts

I hope this hack will allow creating some interesting mods for Gen5 cars. For example, I’d love to see an app which records a video stream from the car’s camera and saves it on a USB stick. Of course, the ultimate goal remains running Doom on the head screen :)

If you have any comments or feedback, you can leave them on Github.

'경로 및 정보' 카테고리의 다른 글

mobilgene Classic  (0) 2023.01.27
자율주행차 보안 모델 KISA  (0) 2023.01.26
Auto Conference  (0) 2023.01.20
UNECE UNR.155 차량 사이버 보안 규제 대응을 위한 공격 시나리오 도출  (0) 2023.01.18
MDS Tech  (0) 2023.01.17
블로그 이미지

wtdsoul

,

Auto Conference

경로 및 정보 2023. 1. 20. 15:00

[컨퍼런스 후기] 2022 Sure Autom.. : 네이버블로그 (naver.com)

 

[컨퍼런스 후기] 2022 Sure Automotive Conference

안녕하세요. 슈어소프트입니다. 4월 14일에 "2022 Sure Automotive Conference" 컨퍼런스가 ...

blog.naver.com

 

 

 

블로그 이미지

wtdsoul

,

 

 

UNECE UNR.155 차량 사이버 보안 규제 대응을 위한 공격 시나리오 도출 - 한국자동차공학회논문집 - 한국자동차공학회 : 논문 - DBpia

 

UNECE UNR.155 차량 사이버 보안 규제 대응을 위한 공격 시나리오 도출 | DBpia

이슬기롬, 조세라 | 한국자동차공학회논문집 | 2021.08

www.dbpia.co.kr

 

 

'경로 및 정보' 카테고리의 다른 글

Hyundai Head Unit Hacking 경로  (0) 2023.01.26
Auto Conference  (0) 2023.01.20
MDS Tech  (0) 2023.01.17
임베디드 보안성 향상을 위한 역분석 (교육)  (0) 2023.01.17
A SPICE 3.1 Korean 다운로드 경로  (0) 2023.01.11
블로그 이미지

wtdsoul

,

MDS Tech

경로 및 정보 2023. 1. 17. 15:18

Debugging and Verification Tool Chain (trace32.com)

 

 

 

블로그 이미지

wtdsoul

,

한컴아카데미 IT융합 전문교육센터 (hancomacademy.com)

 

MDS아카데미 교육과정

임베디드 보안성 향상을 위한 역분석

hancomacademy.com

 

최근까지 사이버 위협의 대부분은 PC 기반 운영체제에서 실행되는 소프트웨어에 초점이 맞추어져 있지만 최근 들어 임베디드 장치를 대상으로 해킹 및 악성코드를 실행되는 공격 사례가 빠르게 증가하고 있습니다. 이러한 공격에 대비하기 위해서는 개발 단계 뿐만아니라 공격 당한 임베디드 장치를 분석하기 위한 방법이 필요합니다.
따라서 본 교육과정에서는 임베디드 장치의 공격 사례에 초점을 맞추어, 안전한 임베디드 장치의 개발 방법론과 임베디드 장치의 취약점 분석을 위한 역분석 기법을 실습 위주로 제공합니다.

* 필수 선수지식 : 어셈블리, 리버싱, 컴퓨터 아키텍처
* 실습환경

- USB 연결이 용이한 PC 환경 (Windows), VMWare, IDA Pro 7.5 설치

- 실습 대상 장치 : IPTime A3004NS-BCM(ARM), TP-Link TL-WR840N(MIPS) (1인당 1대)

 

 

 

블로그 이미지

wtdsoul

,

 

한컴아카데미 IT융합 전문교육센터 (hancomacademy.com)

 

한컴아카데미 IT융합 전문교육센터

 

hancomacademy.com

 

 

 

 

 

 

 

'하드웨어 해킹 및 임베디드' 카테고리의 다른 글

STM32 보드 임베디드 진행 전  (0) 2023.02.19
TELECHIPS社 TCC8925 안드로이드용  (0) 2023.02.15
Car Hack Github 경로  (0) 2023.01.13
CVE-2022-38766 AUTOCRYPT  (0) 2023.01.12
How I Hack my car 경로 참고  (0) 2023.01.11
블로그 이미지

wtdsoul

,