반응형


4월 5월 코드게이트에서 이벤트로 진행되었던 OPEN CTF 일부 문제 풀이입니다.



- DoorLock Hacking

- Car Canbus Hacking





DoorLock Hacking


도어락의 펌웨어를 분석하여 비밀번호를 알아내서 도어락 해제후 안에 들어있는 FLAG를 얻으면 되는 것이었습니다.


주어진 펌웨어는 ARM에서 작동하는 32bit ELF 파일입니다.


IDA를 이용하여 분석하면 됩니다.




Shift + F12 단축키를 이용해 Strings를 확인 할 수 있습니다.





들어가보면 키패드 문자처럼 보이는 것들이 뜨네요.


여기서 스크롤을 위로 올라가다 보면




각 함수 하나에 정수 하나씩 있는 것을 확인 할 수 있습니다.


조합해보면 


19981217


누군가의 생일 같아 보이네요.


키패드를 누를때 *눌러 시작하고 #을 눌러 완료하면 됩니다.



도어락 비밀번호 : *19981217#


그후 안에 있는 FLAG를 확인 합니다.






Car Canbus Hacking


자동차 계기판에서 RPM을 5000으로 올리면 되는 문제.

-아두이노 불량인 줄 모르고 3시간 동안 삽질했었던....



문제를 풀기 위해선 아두이노와 캔통신모듈이 필요했습니다. 



힌트로 제공된 링크 :


http://orasman.tistory.com/282

http://bimmerforums.com/forum/showthread.php?1887229-E46-Can-bus-project




첫번째 링크 포스트를 통해 이두아노와 캔통신모듈의 배선 연결 표를 참고하여 연결할 수 있습니다.


아두이노를 설치한 후 다음 링크에서 라이브러리를 다운받아 설치합니다.

https://github.com/coryjfowler/MCP_CAN_lib



아두이노를 설치해 주고 위 링크에 있는 예제중 CAN_Send를 불러 옵니다.


기본 설정은 힌트를 참고해 수정해 줍니다.


MCP_16MHZ -> MCP_8MHZ

delay(100); -> delay(10);  # 사실 딜레이는 큰 상관이 없습니다.


CS는 10번핀에 꽂아줍니다.



이제 수정해야 할값은 ID와 DATA뿐입니다.


이것들은 두번째 링크를 참고해 줍니다.


우리한테 필요한부분은 RPM을 올리는 것이므로 RPM부분을 찾아봅시다.



ARBID: 0x316 (DME1) 
-B0
-B1 
-B2 RPM LSB
-B3 RPM MSB [RPM=(hex2dec("byte3"&"byte2"))/6.4]
-B4
-B5
-B6
-B7



설명을 보면 ID는 0x316, B0~B7은 DATA배열에서 각 설명입니다.

B2와 B3만 수정해주면 될 것 같습니다.


B3을 보면 RPM=(hex2dex("byte3"&"byte2"))/6.4 라는 식이 있습니다.


이 식의 의미는 B3 + B2 의 값을 10진수로 변환 하여 6.4로 나눈 값이 RPM이 된다는 것입니다.


여기서 B3 + B2의 의미는 예로 들면 B2 = 0xAB이고 B3= 0xCD일때 0xCDAB가 되는 것입니다.



우리는 RPM = 5000으로 만들어야 합니다.


5000 x 6.4 = 32000, dex2hex(32000) = 0x7D00


B3 = 0x7D, B2 = 0x00 이 되겠네요.



위의 값을 가져와 코드를 수정해 줍시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <mcp_can.h>
#include <SPI.h>
 
MCP_CAN CAN0(10);     // Set CS to pin 10
 
void setup()
{
  Serial.begin(115200);
 
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) Serial.println("MCP2515 Initialized Successfully!");
  else Serial.println("Error Initializing MCP2515...");
 
  CAN0.setMode(MCP_NORMAL);   // Change to normal mode to allow messages to be transmitted
}
 
byte data[8= {0x000x000x000x7D0x000x000x000x00};
 
void loop()
{
  byte sndStat = CAN0.sendMsgBuf(0x31608, data);
  if(sndStat == CAN_OK){
    Serial.println("Message Sent Successfully!");
  } else {
    Serial.println("Error Sending Message...");
  }
  delay(10);
}
cs



이후 아두이노에 코드를 업로드 하면 계기판의 RPM이 5를 가리키고 있는 것을 확인 할 수 있습니다.

반응형

'CTF Write Up' 카테고리의 다른 글

KDMHS CTF 2018 Write-up  (0) 2018.06.18
H3X0R 4rd CTF 2018 [easy_png] Write-up  (0) 2018.06.14
제 1회 TEAMH4C CTF Write Up  (0) 2017.10.29
[EKOPARTY CTF 2017] Malbolge  (1) 2017.09.17
CRC CTF 2017 Write-up  (0) 2017.09.13

+ Recent posts