여기서는 QEMU의 PANDA's 버전을 사용한다.
CPU 추가
우선 아래 명령을 통해 panda를 clone한다.
https://github.com/panda-re/panda/blob/dev/panda/docs/build_ubuntu.md
sudo apt-get update
# clone PANDA
git clone https://github.com/panda-re/panda
panda/target/arm/cpu.c 파일에서 1558번째 줄부터 이어지는 내용 중, cortex-r5와 cortex-a7 사이에 같은 내용으로 cortex-r7을 추가한다.
static const ARMCPUInfo arm_cpus[] = {
#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
{ .name = "arm926", .initfn = arm926_initfn },
{ .name = "arm946", .initfn = arm946_initfn },
{ .name = "arm1026", .initfn = arm1026_initfn },
/* What QEMU calls "arm1136-r2" is actually the 1136 r0p2, i.e. an
* older core than plain "arm1136". In particular this does not
* have the v6K features.
*/
{ .name = "arm1136-r2", .initfn = arm1136_r2_initfn },
{ .name = "arm1136", .initfn = arm1136_initfn },
{ .name = "arm1176", .initfn = arm1176_initfn },
{ .name = "arm11mpcore", .initfn = arm11mpcore_initfn },
{ .name = "cortex-m3", .initfn = cortex_m3_initfn,
.class_init = arm_v7m_class_init },
{ .name = "cortex-m4", .initfn = cortex_m4_initfn,
.class_init = arm_v7m_class_init },
{ .name = "cortex-r5", .initfn = cortex_r5_initfn },
{ .name = "cortex-r7", .initfn = cortex_r7_initfn }, //추가
{ .name = "cortex-a7", .initfn = cortex_a7_initfn },
{ .name = "cortex-a8", .initfn = cortex_a8_initfn },
그리고 적당한 위치에 다음 내용을 추가한다.
static void cortex_r7_initfn(Object *obj)
{
ARMCPU cpu = RAM_CPU(obj);
cortex_r5_initfn(obj);
cpu->pmemsav = 32;
}
이렇게 코드를 수정하고 초기화 함수를 복사하는 것은 항상 직관적인 것은 아니며 모든 경우에 동작하지 않을 수 있다. ARM CPU는 아키텍처와 명령어 집합에서 많은 부분을 공유하고 있기에 가능하다.
임베디드 펌웨어 에뮬레이팅
위 링크에서 펌웨어 이미지를 다운로드 받고 추출한다. lz4는 zip처럼 압축 파일의 한 형태로 갤럭시에서 이 방식을 사용한다고 한다. 추출하면 mdeom.bin 파일만 남게 된다.
sudo apt-get install lz4
lz4 -d CP_G973FXXU3ASG8_CP13372649_CL16487963_QB24948473_REV01_user_low_ship.tar.md5.lz4
tar xvf CP_G973FXXU3ASG8_CP13372649_CL16487963_QB24948473_REV01_user_low_ship.tar.md5
lz4 -d modem.bin.lz4
xxd를 이용해 파일을 16진수로 본다. -g 4는 4바이트만큼 묶어서 표현하란 뜻이고, -l 0xc0은 c0까지 hex dump하란 뜻이다.
xxd -g 0x04 -l 0xc0 modem.bin
TOC 섹션은 첫 96비트(12바이트)를 사용하고, 다음 4바이트는 파일 오프셋으로 사용된다. 두 번째 줄 첫 블록의 00800040은 메모리의 로드 주소로, little endian 형식이라 0x04000800으로 인식한다. 다음은 섹션의 크기(10040000), CRC(00000000), 엔트리 ID(00000050)를 나타낸다. 가장 중요한 부분은 main 섹션이 어디서 시작하는지를 알려주는 부분이다. 0x2206이라고 나와 있다.
참고자료
우분투 lz4 압축 해제: https://devmonster.tistory.com/126
xxd 사용: https://twpower.github.io/122-xxd-command-usage
Antonio Nappa , Eduardo Blázquez - Fuzzing Against the Machine
'보안 > fuzzing' 카테고리의 다른 글
[하드웨어 해킹]OpenWrt 풀 시스템 퍼징 (1) | 2024.02.06 |
---|---|
[하드웨어 해킹] shannon 퍼징 (0) | 2024.01.22 |
[하드웨어 해킹] CVE-2011-0531 재현하기(실패) (0) | 2024.01.19 |
[하드웨어 해킹] 퍼징 기술 (0) | 2024.01.15 |
[하드웨어 해킹] 퍼징과 분석 기술 - 심볼릭 실행 (0) | 2024.01.11 |