반응형
반응형

마감되었습니다.



티스토리 초대장 10장을 배포합니다.

# 등록일 : 18.04.26 16:26


# 17:18 3장 남았습니다.

# 19:36 1장 남았습니다.



신청 양식:

0. 블로그 운영 목적

1. 공감버튼 눌러주세요

2. 추가로 하실 말

3. 이메일 주소

4. "신청합니다." 라고 작성




*선착순이 아닙니다.

*양식을 지키지 않을 경우 제외.

반응형
반응형


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
반응형

반복적으로 같은 요청을 하는 (도배)를 막는 기능을 추가하겠습니다.




kakao auto_reply에서 제공하는 user_key를 이용하겠습니다.

user_key는 옐로우 아이디 마다 부여되는 고유 키값입니다.


처음에는 user_key값을 이용하여 반복적으로 동일한 요청을 해올 경우 딜레이를 주는 방법을 사용하려고 했지만

구현할 방법을 모르겠어서...


직전에 요청한 유저와 다음 요청해온 유저가 같을 경우 함수를 실행하지 않고 리턴하는 방법을 사용하겠습니다.

이 경우 다른 유저가 요청해오지 않는 이상 한 유저가 연속으로 요청을 할 수가 없게 되죠.


도배로 고통받는 개발자...




모든 요청(버튼)에 대해서 적용하는 방법과 각각의 요청(버튼)에 적용하는 방법이 있습니다.

모든 요청(버튼)에 적용하게 되면 한 요청을 했을 때 바로 다른 요청을 할 수가 없으므로

각각에 요청에 적용하는 방법을 사용하겠습니다.

그러기 위해서 class 를 사용하겠습니다.





코드 작성하기


적용된 전체 코드 :  https://github.com/M4ndU/inhun_kakao_chat_bot_2/blob/master/views.py




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class user_chk():
 
    def __init__(self):
        self.pre_key = "" #이전 user_key값
        self.now_key = "" #현재 user_key값
 
    def check(self, key):
        self.now_key = key # now_key값에 현재 user_key값 대입
 
        if self.pre_key == self.now_key : # 비교 하여 같으면 1을 반환
            passcode = 1
        else :
            self.pre_key = self.now_key # 다를 경우 pre_key값에 now_key값을 덮어쓰고 0 반환
            passcode = 0
        return passcode
cs



바로 다음 코드들을 작성하여 값 초기화 설정을 해 둡니다.

필요한 개수 만큼 작성합니다.


1
2
3
4
 
u0 = user_chk()
u1 = user_chk()
 
cs



이렇게 하면, u0.check(user_key)를 실행하게 될 경우

이전 user_key값(=pre_key)과 비교하여 같으면 1 반환, 다르면 pre_key에 저장하고 0을 반환합니다.


u0, u1각각 독립적으로 사용되기 때문에 u0.check("dd")를 했다고 해서 u1.pre_key에 dd가 드러가지 않는 것이죠.

이를 통해 각각 요청(버튼)에 적용하여 사용할 수 있습니다.



이제 user_key값을 가져와 봅시다.


1
2
3
4
...
    datacontent = received_json_data['content']
    user_key = received_json_data['user_key']
 
cs


기존 작성했던 datacontent = received_json_data['content'] 바로 밑에 작성해 줍니다.




user_key값도 불러왔으니 이제 각 분기마다 적용해줍니다.


https://github.com/M4ndU/inhun_kakao_chat_bot_2/blob/master/views.py

92~104


92
93
94
95
96
97
98
99
100
101
102
103
104
    if datacontent == '오늘 급식':
        if u0.check(user_key):
            return ret_proc(PlzStopIt)
        dt = datetime.datetime.today()
        diet = get_meal(dt)
        return ret_proc(diet)
 
    elif datacontent == '내일 급식':
        if u1.check(user_key):
            return ret_proc(PlzStopIt)
        dt = datetime.datetime.today() + datetime.timedelta(days=1)
        diet = get_meal(dt)
        return ret_proc(diet)
cs



        if u0.check(user_key):

            return ret_proc(PlzStopIt)


를 통해서 u0.pre_key = u0.now_key가 되어 1을 반환하게 되면

조건이 True가 되어 밑에 작업을 진행하지 않고 바로 문자열을 바로 반환합니다.

그럴려면 PlzStopIt에 문자열을 저장해주어야 겠죠?


반응형

+ Recent posts