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
문제를 풀기 위해선 아두이노와 캔통신모듈이 필요했습니다.
힌트로 제공된 링크 :
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] = {0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00}; void loop() { byte sndStat = CAN0.sendMsgBuf(0x316, 0, 8, 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 |