임베디드 해킹 - 컴퓨터와 임베디드

2025. 3. 25. 11:37카테고리 없음

컴퓨터: 범용 목적으로 사용

임베디드 기기 : 특정 목적을 위해 사용

 

원래는 휴대폰도 휴대 가능한 전화기라는 특수한 목적으로 개발 되었지만, 이제는 기술의 발달로 컴퓨터와 휴대폰의 목적에 대한 차이가 모호해지고 있다.

 

 

펌웨어 : 원래 EPROM, Erasable Programmable Read-Only Memory에 담긴 데이터를 칭하는 단어

 

*EPROM 이란? 과거에 사용되던 비휘발성 메모리로, Figure2의 중앙에 있는 칩에 자외선을 사용하여 데이터를 작성, 프로세서는 EPROM을 읽어 데이터에 있는 명령어를 실행하게 된다.

 

자외선을 사용하여 칩에 데이터를 쓰는 방식은 굉장히 번거로웠기 때문에, 한번 데이터를 쓴 이후로 변경되는 일은 거의 없었기 때문에  ‘변동 없는, 굳은'의 의미를 가진 Firm이라는 단어가 사용되었고, '제품, 상품’의 의미를 가진 ware가 합쳐져 Firmware가 되었다.

 

하지만 최근에 임베디드 기기에 사용되는 비휘발성 메모리는 EPROM이 아닌 Flash memory가 주를 이루고 있고, 이에 펌웨어의 본래 의미는 점차 사라지며 임베디드 기기의 비휘발성 메모리에 담긴 데이터를 펌웨어로 부르게 되었다.

 

* Flash memory: 전기적으로 읽고 쓰기가 가능한 메모리로 USB나 SSD가 Flash memory를 사용

 

 

컴퓨터 구조


컴퓨터에는 CPU, 그래픽 카드, RAM, HDD/SSD 그리고 이 모든 것들을 담을 메인보드가 존재한다.

CPU :  명령어 처리

그래픽카드 : 그래픽 처리

HDD& SSD :  OS를 담고 또 소프트웨어 및 데이터를 저장

RAM : 소프트웨어들을 실행하기 위해 필요

메인보드 : 각자 부품이 가진 역할을 발휘할 수 있도록 부품들을 다 같이 연결 

 

부품을 나누는 이유? : 업그레이드를 위해서, 고장난 부품 발생 시 그 부품만 바꿔줄 수 있다.

 

 

 

임베디드 구조


일반적으로 SoC/MCU, RAM, Flash memory가 결합된 보드로 구성

 

System on Chip (SoC) & Micro Control Unit (MCU) : 컴퓨터의 CPU와 유사한 역할을 하지만, CPU가 명령어 처리만 수행하는 반면, SoC와 MCU는 그 이상의 기능 제공. 제공되는 기능은 칩에 따라 다르기 때문에, 보통은 제품이 요구하는 기능에 맞춰 SoC나 MCU를 선택한다.

 

일반적으로 SoC와 MCU는 Reduced Instruction Set Computer (RISC) 아키텍처인 ARM과 MIPS를 사용

이 아키텍처들은 Complex Instruction Set Computer (CISC)보다 명령어 셋이 매우 간소화되어 있고, 명령어의 개수가 적어 설계가 단순하다는 장점이 있으며  명령어의 길이가 일정하게 고정되어 있어 처리가 빠르다.

 

ARM 프로세서 같은 경우에는 저전력을 사용하면서도 높은 효율을 낼 수 있게 설계되어있다.

 

Flash memory : 컴퓨터에서 HDD와 SSD의 역할을 하는 저장 장치. 실제로 SSD는 여러 개의 플래시 메모리를 결합하여 큰 용량을 가진 저장 장치로 만들어진다. 사진을 보면 USB 안에도 하나의 NAND Flash memory를 사용 하는걸 확인할 수있다. 

 

* RAM disk?  RAM 을 기억장치로 사용하는것을 말한다. 기기가 켜질 때, Flash memory 에 있는 데이터를 모두 RAM 으로 옮겨서 사용하고, 기기가 꺼지게 되면 RAM 의 데이터는 모두 사라진다.

임베디드 기기는 데이터 저장 보다는 맡은 기능만 잘 수행하면 되기 때문에 RAM Disk를 사용하여 파일 접근 속도를 향상 시킨다.

 

컴퓨터와 임베디드의 차이


 

임베디드는 그 안에서 운영체제, 소프트웨어를 실행하기 때문에 그래픽 카드 제외 컴퓨터에 필요한 모든 요소를 포함하고있다. ( 그래픽 처리가 필요하지 않은 장치라면 고성능의 그래픽 카드는 필요가 없기 때문)

 

그러면 단순히 컴퓨터와 임베디드는 그래픽 카드 유무만 차이날까? 

 

임베디드는 단일 제품으로, 최소한의 비용으로 빠르게 제품을 출시하여 경쟁력 있는 제품을 만들려고 한다.

이로 인해 보안성이 저하된다. 보안에 대안 투자, 관심이 상대적으로 감소하며, 공격을 받더라도 공격자가 할 수 있는 행동이 제한적이니 패치의 필요성을 크게 느끼지 못하는 경우가 많고, 펌웨어 업그레이드 기능이 없어 패치가 불가능한 기기도 많다.

 

반면 컴퓨터 운영체제 위에서 실행되는 소프트웨어는 다양한 보호기법, 빠른 패치를 통해 보안성을 지속적으로 향상시키고 있으며, 안에 중요한 정보가 많고 공격자가 할 수 있는 행위가 많기 때문에 보안성을 중요시하는 체계가 형성되어있다.

 

 

 

 

임베디드 펌웨어


 

특정 기기를 타겟으로취약점 분석을 진행하려면, 기기의 펌웨어를 얻어야 한다.

 

펌웨어는 비휘발성 메모리에 저장된 데이터를 가리킨다. 임베디드 기기에서 사용되는 비휘발성 메모리는 플래시 메모리이기 때문에, 플래시 메모리의 데이터를 읽으면 펌웨어를 얻을 수 있다.

 

플래시 메모리는 어떻게 읽냐? 

 

플래시 메모리는 IC 칩의 패키징에 따라 사진처럼 다양한 형태를 가집니다. 주로 다리가 8개인 SOP-8핀과 다리가 48개인 TSOP-48핀이 있습니다. 해당 칩의 다리들에 특수한 장비를 연결해서 읽으면 된다. 

 

SOP-8핀 / TSOP - 48핀

 

펌웨어 구조

 

부트로더, 커널, 파일시스템으로 구성되어있다.

 

부트로더(Boot Loader) :  기기가 켜질 때 가장 먼저 실행되는 프로그램으로, 하드웨어 초기 설정 진행과 커널을 메모리에 로드하는 역할을 담당

 

::하는 일::

  1. 기기 하드웨어 초기 설정
  2. 압축된 커널 이미지(zImage, bzImage, uImage)를 램으로 복사
  3. 커널 이미지의 앞단에 있는 커널의 압축을 푸는 코드 실행

부트로더는 커널을 올리는 컴퓨터와 임베디드에 모두 필요한 프로그램으로, 임베디드에서는 U-BOOT 자주 사용

 

 

 

커널: 운영 체제의 핵심 구성 요소로, 시스템 자원 관리와 사용자와 하드웨어 간의 인터페이스 역할을 수행

화면 출력, 메모리 관리, 키보드 및 마우스 조작 등, 시스템의 거의 모든 요소를 관리하고 있다.

 

아래 코드를 64비트 리눅스에서 실행했을 때 

 

#include <stdio.h>

int main(void){
  printf("Hello World\n");
  return 0;
}

 

 

커널은

1. 메모리에서 실행시킬 공간 할당

2. printf 명령어실행시  yscall 1(write)이 호출되어 커널에게 출력 작업을 요청

3. 프로그램 종료 시 syscall 60(exit)을 호출하여 커널에게 프로그램 종료와 관련된 메모리 정리 작업을 지시

 

파일시스템 : OS가 저장 장치에 들어있는 데이터 및 파일들을 체계적으로 관리하기 위한 시스템실제로 커널이 파일 시스템을 인식하지 못한다면, OS는 저장 장치에 들어있는 데이터가 어떠한 형식으로 저장되어 있는지 모르기 때문에 파일들을 확인할 수 없다.

파일 시스템의 종

파일 시스템이 많은 이유는 각자 OS 혹은 저장 장치의 구조에 따라서 더 알맞은 구조의 파일 시스템을 사용하기 위함이다.

 

파일 시스템 중에서도 기기의 메인이 되는 파일 시스템을 루트 파일 시스템이라고 한다.

 

리눅스의 경우 / 가 루트 파일 시스템의 경로가 됩니다. 즉 루트 파일 시스템을 얻게 되는 경우 / 경로 아래에 있는 모든 파일을 얻을 수 있다.

 

우리는 펌웨어를 얻어, 파일 시스템을 추출하면 기기의 작동을 책임지는 서비스 바이너리를 얻을 수 있다.