UEFI 스터디 1회차
Published:
굉장히 개괄적인 이해를 위해 넓게 설명한다. 사실상 프로젝트에 필요한 내용은 매우 일부일 듯하다.
부팅 과정 (bios)
전원 버튼을 누름 → psu에서 메인보드로 전기공급 -> 메인보드에 연결된 하드웨어들 깨어남 → cpu는 뭔가 하기 위해서 펌웨어를 깨움. (현재는 램이 비어 아무것도 할 수 없음)
펌웨어 소프트웨어와 하드웨어 중간, 컴퓨터마냥 자주 지워졌다 새로 깔고 하는 소프트웨어랑 달리, 일반적인 기기들 처럼 한번 설치하고 그대로 쓰기만 하게 되는 경우. 롬에 깔림.
BIOS 컴퓨터의 펌웨어 = basic input/output system. 줄여서 bios 아주 기초적인 입출력이 가능해짐(디스플레이, 키보드 정도)
어떤 하드웨어들이 연결되어 있는지 확인, 연결 및 초기화, 화면에 표시 (power on self test, post) →운영체제가 저장된 저장장치를 검색.(이는 설정해서 cmos에 저장되어 있음. bios setup utility로 따로 수정 가능) ->바이오스가 운영체제를 찾기 위해서 스토리지 첫째 섹터는 운영체제 정보 적어둠 (master boot record , MBR). 바이오스는 MBR을 메모리에 올리고 부트코드를 실행시킴.
부트코드는 매우 작음. → MBR의 파티션 테이블의 부팅가능한 파티션의 첫번째 섹터(볼륨 부트 레코드)를 메모리에 불러와 부트코드를 실행,
볼륨 부트 레코드에는 파일시스템 정보 존재 → 이제부터 충분한 기능이 있는 파일형태 프로그램 실행 가능. 이 프로그램이 운영체제를 메모리로 올려줘서 부트로더라고 함. 최종적으로 운영체제를 메모리에 올려서 실행 시킴. => 복잡.
이후는 커널 실행 → 데몬 실행 → 셀 실행 →시작프로그램들 실행.
UEFI(통일 확장형 펌웨어 인터페이스)
기존 바이오스를 대체하는 펌웨어 규격. 64비트 기반
컴퓨터의 부팅과정이 복잡하고, 운영체제마다 제각각. 구식인 bios의 구조적 한계 (MBR 방식의 파티션 개수와 스토리지 크기 제한) 이래서 UEFI 점차 대체
나아진 것들
2TB 이상 저장장치도 부팅시 사용가능
32비트 = 2^32, 하드 디스크 섹터 크기 = 512바이트 => 기존 2테라 정도
64비트 기반으로 개선 되며 해결빠르고 간단해진 실행
GPT 방식을 채택, 이 방식은 처음부터 파일시스템을 이해한다. 따라서 바로 디스크 특정 파티션의 부트로더로 접근해서 메모리로 로딩이 가능하다.
gpt 방식은 cmos에서 부팅 목록의 알맞은 곳을 확인해서 파일 시스템상 부트로드가 있는 파티션을 확인. 약속된 위치 (LBA1)의 GPT 파티션 테이블을 파싱해서 파일 시스템 이해 → 경로로 접근(EFI 파티션) → 부트로더 실행.여러개의 파티션 가능.
기존 MBR 방식은 주파티션 4개를 두고, 그이상이라면, 파티션을 확장 파티션ㅇ,로 두고 논리 파티션으로 쪼개는 방법을 복잡함. GPT 방식은 그냥 주 파티션이 최대 128개.이외 UEFI에서 펌웨어와 운영체제사이에 약속 표준및 체계화. UEFI 만의 응용프로그램 실행 가능 새로운 파티션 방식 GPT 방식을 채택 더나은 그래픽 인터페이스(커널 로드전 그래픽 드라이버 로드), 보안기능등…
UEFI의 자세한 단계
sec~dxe 까지는 BIOS의 POST에 대응함.
- SEC(security) → 전원 누르면 실행 되어 CPU 초기화, 펌웨어 검증. DRAM이 초기화 되지 않아서 CPU 캐시를 임시 램으로 사용.
- PEI → 램을 사용할 수 있도록 초기화.
- DXE→ 우리가 열심히 분석할 곳 수많은 드라이버(.efi) 들이 로드되어 디스크, 네트워크, USB.. 등이 사용가능하게 된다. 특히 UEFI 부트로더가 OS커널을 불러오는데 필요한 서비스를 제공하는 드라이버(모듈)들이 모두 실행된다. PEI에서 램이 초기화 되어 이전엔 파일크기를 줄인 TE를 썼으나 이제부턴 PE32 /PE32+ ~=exe 를 실행한다. ⇒ 윈도우용 분석 도구인 Ghidra 같은 툴이 사용가능. boot services(부팅중에 도와주는 것들), run
- BDS → 부트로더 찾기
- TLS → 부트로드 실행
- RT → 부트 프로세스 종료 이후에도 몇개드라입가 메모리 상주하며 필요한 기능 제공
방향성 설정
- 분석의 중심이 될 UEFI의 DXE 단계에만 거의 집중. 앞부분은 하드웨어 초기화라 딱히 변수가 없고 후반은 DXE에서 생성된 프로세스들에 의한 부분. 근본적으로 우리의 분석 대상이 아님.
- 사용할 교재를 빠르게 찾아보기. 원래 UEFI Driver Writer`s Guid를 이용하려 했으나 좀더 타 조원이 어떤 걸 쓰는지 참고해서 더찾아보기로 함. 우리가 UEFI를 만들 것은 아니지만, 어떤 구조, 라이브러리 등을 가졌는지 알아야 이해하고 취약점을 분석하므로, 모든 부분을 따라하지 않고 이해하는 형태로 넘어 갈 것.
- 서웅 조원이 준 자료를 참고해서 툴들을 한번씩 사용해보기.
