패스트터틀

임베디드 시스템 보안(19.5.31) 본문

Cyber Security(undergraduate)/embeded system security

임베디드 시스템 보안(19.5.31)

SudekY 2019. 5. 31. 16:43

Embedded Systems Security: an Overview

 

임베디드 시스템은 전자기기에 들어가는 시스템 Embedded(깊숙히 박혀진)

임베디드 시스템은 굉장히 다양한 분야의 도메인있는데 가장 핵심적인것은 어떤 목적성을 가지고있다는것이다.

목적성이란 테마를 가지고있다는 뜻으로 예를들면 라우터,TV등 특정 목적을 가지고있다는 뜻이다.

 

SOC시스템 = System-on-a-chip = 칩 위에 시스템이 있는것 = 삼성전자가 중요하다고 함

SES = 라스베가스에서 하는 이공계쪽에서는 꼭 가야되는 행사라고 함

Architecture = 어떻게 구성되어있는가에대한것

임베디드 시스템을 분석할때 가장 중요한것중 하나는 UART접근이 있다.

Flash메모리를 제어하는 하드웨어 칩셋까지 전부다 들어가있다.

OpenSSD = 우리나라 한양대학교에서 개발함

모바일 컴퓨팅의 80%는 ARM이 들어가있다. 그런데 네트워킹 쪽으로 가면은 15%미만으로 포지션이 떨어진다.

임베디드 아키텍쳐는 32비트가 많지만 네트워크 처리 분야만큼은 64비트를 사용한다고함

 

F/W (System S/W) Analysis

 

정보 Gathering

1. Official vendor websited (공식 제공 웹사이트)

2. Dev. forums, SNS(developer, researchers) (개발포럼)

3. Datasheets (데이터 시트)

4. GitHub!!

5. Conference materials (자료 회의?)

6. Getting the real target device?

 

S/W Monoculture( Monoculture란 하나만 집중적으로 시도?투자? 하는것을 말함)

1. Donor OS monoculture 

 linux, VXWorks

2. F/W monoculture

  home router F/W from China by subcontraction

  BSP, build-system monoculture?
3. Even some proprietary F/W is built on top of some

already known OS

 

Static Analysis(정적분석)

1. 우선 펌웨어를 얻어야함 하지만 돈을 투자해야되는 경우가 많음

 

JTAG(IEEE 1149.1) 

메모리도 검사하고 레지스트리도 검사하고 여러방면에 대해서 산업계 표준으로 만든것

한마디로 디버깅을 위한 입출력 표준이라고 보면됨

디지털 회로에서 특정 노드의 디지털 입출력을 위해 직렬 통신 방식으로 출력 데이터를 전송하거나 입력데이터를 수신하는 방식(IN wiki)

임베디드 시스템 개발시 디버깅장비가 대표적인 예라고 보면된다.

하드웨어 디버깅은 소프트웨어 디버깅에 비하여 가격은 비싸지만 개발자가 만든 소스 레벨 디버깅이 가능하다.

 

mips architecture

 

닌텐도초창기에는 전부 MIPs 를 썻는데 이때 당시 그래픽처리가 아주 뛰어났기 때문이다.

그리고 하나의 칩에 그래픽까지 전부들어갔기 때문에 아주 좋았음

 

MIPS(Microprocessor without Interlocked Pipeline Stages)

Mips 아키텍쳐는

64x 아키텍쳐와 다르게 레지스터가 굉장히 많고 i-cache & d-cache같이 인스터럭쳐 데이터캐쉬가 분리됨

 

j (jmp명령어)는 다음명령어까지 실행하고 점프함

 

 

 

 

> vi code.s

 

 

Linking : 프로그램을 만들때 main하나말고 c여러가지 만든 엉청난 소스를 쓰는데 이때 이런것과 합치는과정

 

 

> readelf -h ./code 

시작 진입점을 알려주는것

결과적으로 코드를 잘 빌드했다는것을 알수있음

 

printf 가 없기 때문에 아무것도 확인할수없는데 그렇기 때문에 동적분석으로 할것임

 

 

 

 

브레이크 포인터를 걸어서 400094부분에서 멈췄음

 

레지스트리 보기..

 

한줄 실행시키기 > si    -- signle step 하나만 실행시키기

 

 

그리고 다시레지스트를 확인해보면 확인가능하다.

이과정은 밑바닥부터 보는과정으로 다른 프로그램 아키텍쳐에서도 이런과정은 동일하다고 보면?된다

 

빠져나오고나서

> vi func_call.c

 

넣어서 다 더해 버리는 프로그램

인자가 너무 많다. 몇개까지는 레지스터에 올라가지만 그 후에는 메모리에 올라간다.

 

레지스트리에 들어간걸 확인할수있다.

 

코드에서 보면은 a0,a1,a2,a3로 들어왔는데 그거를 다시 l_a, l_b 이렇게 넣고 있음

 

64 68 72 76 으로 들어간겄을 확인할수있음

 

이렇게 이런식으로 데이터를 추적하면되는것이다. 

 

 

 

 

 

 

 

 

 

공격코드에 대한 페이로드를 만들때 아까 봤던 주소나 버퍼를 가지고 공격을 함

특정한 페이로드에 임의로 점프할수있는 코드를 넣어놓고 id pw 를 알아낼수있는 그런 코드작성 동영상을 보여주었음 근데 시간이 오래걸리기 때문에 혼자서는 힘들기때문에 협력을 해서 한다고 했음

 

또하나의 운영체제에서 중요한 요소가 하나가 System call인데 printf쓸때 Hello World를 쓸때 커널로 들어가서 커널에서 디스플레이 드라이버에 커널코드가 있는데 그 안에 리눅스같은 그런 하드웨어 주소에 색깔 RGB컬러로 해서 컬러가 나타나는데 특정 레지스트리에 RGB에 어떤 값을 넣고 해당되는 픽셀에 XY에서 (데이터시트에) 거기에 특정값을 넣으면 100x100에 하나 값을 넣어라 라는 그런것에서 printf에서 HelloWorld는 디스플레이에 출력될때 이런것들은 전부 커널에 있다고함 그러면 Systemcall은 디바이스 드라이브에 데이터를 넘기는역할을 함 그러면 방금 말한 과정을 거쳐서 하는 트리를 타게 된다고함 . 

 

물론 HelloWorld뿐만 아니고 네트워크 등등 유저레벨을 떠나 운영체제의 도움을 받아야되는데 그럴때 이런것들을 SystemCall이라고 부른다.

 

Hello world 프로그램 같은 경우는 c에서 제공해주고 (하나하나 코딩할수있지만 시간낭비) 

User Application -> C - > 위에 말한과정..~~~

 

System call번호로 특정 함수? 를 특정할수있다고함

더욱 Low level에서 짠다고 하면은 printf -> write90, " HI werwer", 17);

 _exit(0xab); 이런식으로 운영체제의 도움으로 짜지는것

 

 

Comments