Layer7 동아리 과제

하드웨어 3, 4차시 과제

msh1307 2022. 6. 19. 17:22

임베디드 시스템

임베디드 자체는 atmega칩 같은 MCU를 포함하는 개념이지만, 일반적으로는 MCU보다 상위급 성능을 가진 프로세서를 가진 시스템을 자주 말한다. 요즘엔 기술이 발달해서 임베디드 쪽도 사용하는 프로세서 수준이 과거의 일반 컴퓨터급의 성능이 되어서 높은 티어의 임베디드 시스템은 아예 OS를 올리는 경우도 많다. 

포괄적인 의미로는 특정한 기능을 수행하는 컴퓨터 시스템이다. 범용 컴퓨터의 반대말이다.

특정 기능에 집중해서 설계자들이 최적화해서 크기나 생산 비용을 줄이거나 성능을 향상시킬 수 있다.

SoC를 통해 경량화, 소형화될 수 있다. 

 

회로 설계에 관련이 많다 보니 이런 로직 게이트랑 관련이 깊다.

and는 둘 다 1일 때 1을 출력하고, nand는 and에다 not을 한 거다. 

or은 둘 중 하나 1일 때 1을 출력하고, nor은 or에다 not을 한 거다.

not은 0이면 1, 1이면 0을 출력한다. 

xor은 둘 중 하나가 1일 때만 1을 출력하고 xnor은 xor에다 not 한 거다.

 

SoC

SoC는 System on Chip의 약자로 말 그대로 하나의 칩에 시스템이 올라가 있는 것을 말한다. 

일반적인 조립식 컴퓨터와 다르게 CPU, RAM, ROM 같은 것들이 칩 하나에 다 들어가서 시스템을 이룬다. 

 

SoC는 주로 모바일 기기, 아두이노 같은 저전력 디바이스에 자주 사용된다. 

단일 칩에 막 때려 넣어서 고성능 프로그램 돌리면 발열이 심한 편이다. 

MCU 기반 SoC

SoC의 예시로 MCU(Micro Controller Unit)를 들 수 있다.

 

MCU는 MPU(Micro Proccessor Unit)와 메모리, I/O 인터페이스가 다 박혀있다. 

MPU는 기본적으로 CPU와 거의 비슷한 개념이고 기계어를 해석하고 연산을 수행하는 기능에 중점을 두고 있다. 그냥 소형화된 CPU라고 보면 편하다. 주변에 RAM, ROM, I/O 장치 없으면 동작을 못한다. 

MPU의 예시로 AP를 들 수 있는데 

AP는 CPU 기능과 주변 장치를 제어하는 칩셋의 기능을 포함한다. 성능이 MCU보다 대체로 좋아서 OS가 올라가는 경우가 많다. MMU(Memory Management Unit) 같은 OS를 올리기 위한 것들도 많이 있다. 

퀄컴 스냅드래곤이나 애플 A 시리즈 같은 것들이 여기에 포함된다. 둘 다 핸드폰에 들어가는 MPU이다. 

퀄컴 스냅드래곤, 애플 A8

 

MCU는 규모가 작은 시스템을 제어하기 위한 전용 프로세서로 자주 쓰이다 보니 대체로 OS를 포함하지 않고 펌웨어만 사용해서 경향이 있다. AP보다 성능이 대체로 안 좋다. 

인터넷에서 주워 온 MCU 사진인데, 대충 봐도 작아서 OS가 돌아갈 것 같지는 않아 보인다. 

STC15F204EA

 

하드웨어 인터페이스

SPI, I2C 같이 끝에 딸려있는 것들을 하드웨어 인터페이스라고 한다. 

각자 통신에 사용되는 프로토콜과 커넥터가 따로 있다.

통신 방식

동기식 통신은 클록 신호를 따로 회선을 만들어서 동기화하는 방식이고, 비동기식은 시작 비트와 정지 비트를 통해서 블록의 동기화를 해주는 방식이다. 

비동기식이 그래서 통신을 시작할 때 오버헤드가 있다. 

직렬 VS 병렬

USB 같은 건 다 시리얼 통신이다. 

통신을 위한 하드웨어 인터페이스 종류

UART

UART(Universal Asynchronous Receiver/Transmitter)는 호스트가 보조 장치와 통신할 수 있도록 한다.

양뱡향, 비동기 및 직렬 데이터 전송을 지원한다.

디지털 핀 두 개로 통신한다.

하나는 TX, 하나는 RX로 송신과 수신 역할을 한다.

디버깅하려고 많이 쓴다. 

신호 분석해서 braudrate를 알아낼 수 있다. 

100us는 9600, 69us는 14400 이런 식으로 알아낼 수 있다.

두 장치를 연결할 때 이렇게 연결해주면 되겠다.

 

GPIO(General-Purpose Input/Output)는 기능이 정해지지 않고 입출력 용도로 사용하는 디지털 신호 핀이다. 작성한 프로그램대로 신호를 주고받는데 쓰인다.

 

 I2C

I2C(Inter Integrated Circuit)는 하나의 마스터가 다수의 슬레이브 장치와 직렬 통신을 할 수 있도록 한다. UART와 다르게 동기 신호를 사용한다. SDA, SCL 두 개 라인으로 통신한다.

SDA로 데이터를 보내고 SCL로 클럭을 동기화한다.

반이중 통신을 지원한다.

 

SPI

SPI(Serial Peripheral Interface)는 하나의 마스터가 다수의 슬레이브 장치와 직렬 통신할 수 있도록 해주고 전이중 통신을 지원한다. 

 

펌웨어

펌웨어는 하드웨어에 포함되어서 하드웨어를 직접 제어하는 소프트웨어를 말한다. 

대부분 제조업체에서 장치에 내장시킨다.

펌웨어 구조는 되게 다양하지만 OS가 달린 임베디드 리눅스 같은 경우에는 어느 정도는 정형화된 구조를 가지고 있다.

 

하드웨어 해킹은 대부분 이 펌웨어를 가지고 한다. 물론 OS가 있는 펌웨어를 대상으로 하는 게 일반적이다. 

 

MCU 펌웨어 구조의 예시이다. 

임베디드 리눅스 펌웨어의 구조이다. 

 

부트로더는 OS를 실행시켜주고 하드웨어를 점검해준다. 

디버깅을 위해 부팅 과정을 출력해주기도 한다. 

UBoot, RedBoot, GRUB 등이 있다. 

커널은 OS의 핵심으로 시스템 자원을 관리한다.

 

파일 시스템은 데이터를 접근하기 쉽게 잘 배치하고 관리하는 시스템이다. 

리눅스의 대표적인 파일 시스템으로는 ext2, ext3, ext4 같은 파일 시스템이 있다. 

윈도에는 NTFS 같은 파일 시스템이 있다. 

 

디스크인지 플래시인지에 따라서 파일 시스템이 달라지기도 한다. 

해킹 시나리오

펌웨어 획득 -> 해당 아키텍처로 펌웨어 분석 -> 공격

 

Datasheet

datasheet는 하드웨어 스펙을 적어놓은 문서이다. reference manual도 비슷한 뜻이다. 하드웨어 모델명 뒤에 붙여서 검색하면 제조사부터 하드웨어의 특성, 저항, pin map 등 많은 정보를 얻을 수 있다. 

pin map

 

펌웨어 획득

여러 방법들이 있다. 

 

제조사 다운로드 페이지 이용하는 방법이 있다.

들어가서 다운로드하면 된다.

 

Firmware Dumping / Sniffing 해도 된다. 

임베디드 장비가 펌웨어 업데이트를 할 때 업데이트 패킷을 스니핑 해서 업데이트 파일을 획득하는 방식도 있다.

 Flash Memory Dump

직접 플래시 메모리를 뜯어거나 핀을 연결해서 하면 된다. 가장 마지막에 시도하는 것이 좋다. 

메모리를 떼다가 소자가 망가지거나 합선의 우려가 있기 때문이다.

 

https://github.com/flashrom/flashrom

 

GitHub - flashrom/flashrom: Send patches to review.coreboot.org: https://www.flashrom.org/Development_Guidelines#GitHub

Send patches to review.coreboot.org: https://www.flashrom.org/Development_Guidelines#GitHub - GitHub - flashrom/flashrom: Send patches to review.coreboot.org: https://www.flashrom.org/Development_G...

github.com

깃허브에서 남이 만든 거 가져다 쓰면 된다. 

 

UART

UART 디버깅 인터페이스를 이용하는 방법도 있다. 물론 다른 디버깅 인터페이스가 있으면 그거 써도 된다. 

UART로 커널, OS 메시지를 얻을 수 있다. 운 좋으면 쉘 바로 열리기도 한다. 

디버그 포트는 보드 디자인의 일정한 패턴을 통해 찾을 수 있다. 

UART의 경우에는 3~5개의 핀이 모여있다.

Ground pin은 멀티 테스터로 냅다 찍어보면 된다.

GND는 주로 5V 혹은 3.3V 잡힐 때의 (-) 리드선이다. 

VCC는 5V, TX도 5V, RX는 5V 혹은 0V이다.

잘 찍어보자.

 

이렇게  UART 디버깅 포트를 찾을 수 있다.

오디오 잭처럼 생긴 UART도 있다. 

이렇게 뜯어서 디버깅 포트랑 연결하고

USB UART로 연결한다. 

아까 앞에서 나왔던 거 그대로 연결하면 된다. 

전압은 맞춰줘야 된다. 안 맞춰주면 보드가 죽을 수도 있다.

 

연결 잘했으면 

로그를 얻을 수 있다.

 

시스템 쉘을 이용하는 경우에는 

dump 하면 된다.

 

쉘 접근이 불가능하고 로그만 뿌려준다면, 부트로더를 이용할 수 있다.

부팅 중에 저렇게 빠질 수 있는 경우도 있다. 

그리고 hex dump를 얻을 수 있다.  

https://github.com/gmbnomis/uboot-mdb-dump

이 출력을 바이너리로 변환해주려면 딴 사람이 올려놓은 거 사용하면 된다.

 

GitHub - gmbnomis/uboot-mdb-dump

Contribute to gmbnomis/uboot-mdb-dump development by creating an account on GitHub.

github.com

JTAG

JTAG(Joint Test Action Group)라는 디버깅 인터페이스도 사용할 수 있다. 

UART랑 비슷한데 JTAG로 펌웨어를 바로 획득하거나 디버깅도 가능하다. 

 

JTAG

포트는 기기마다 모양이 다 달라서 찾기 힘들 수 있다. 

이런 장비를 구매해서 사용하면 된다. UART랑 다르게 아키텍처나 MCU별로 다 다르다. 

 

파일 시스템 추출

남이 만든 거 쓰자.

https://github.com/ReFirmLabs/binwalk

 

GitHub - ReFirmLabs/binwalk: Firmware Analysis Tool

Firmware Analysis Tool. Contribute to ReFirmLabs/binwalk development by creating an account on GitHub.

github.com

 

 

바이너리를 획득했으면 분석하면 된다. 

 

'Layer7 동아리 과제' 카테고리의 다른 글

리버싱 3차시 과제  (0) 2022.07.23
리버싱 2차시 과제  (0) 2022.07.20
하드웨어 2차시 과제  (0) 2022.06.11
하드웨어 1차시 과제  (0) 2022.06.08
웹 해킹 8차시 과제  (0) 2022.05.25