반응형

리버싱 20

aarch64 익셉션 핸들링

aarch64의 가장 큰 구조적 특징은 새로운 익셉션 모델을 제공하는 것이다. 익셉션 레벨이 도입되었고, 익셉션 발생과 핸들링, 익셉션 복귀에 대한 규칙이 바뀌었다. 일반적으로 소프트웨어의 실행 흐름을 가로채는 동작을 인터럽트(interrupt)라고 하지만, ARM은 익셉션이라는 용어를 사용한다. 익셉션이 발생하면 이전 실행 흐름에서 벗어나 익셉션 타입에 따른 익셉션 핸들러를 호출한다. 익셉션 핸들러는 익셉션을 처리하고 익셉션 발생 전의 상태에서 실행을 재개한다. 익셉션 타입 익셉션을 발생시키는 상태 및 시스템 이벤트 서비스 호출 인스트럭션 익셉션 abort 익셉션 리셋 익셉션 인터럽트 익셉션 서비스 호출 인스트럭션 익셉션 익셉션을 발생시키는 인스트럭션들이 있다. 소프트웨어에서 좀 더 높은 특권 레벨(p..

리버싱/ARM 2021.02.15

ABI의 레지스터 사용 규칙

아키텍처마다 바이너리들이 상호 동작하기 위한 규칙이 존재한다. 이를 ABI(Application Binary Interface)라고 하는데, ARM도 ABI가 존재한다. C/C++ 같은 프로그래밍 언어나 리눅스의 추가 규칙들이 더해진다. ABI 중에서 함수 호출을 다루는 AAPCS64(Procedure Call Standard for the ARM 64-bit Architecture)는 어셈블리(assembly)와 C함수 사이의 인터페이스, C 함수 호출 등에 관한 내용을 다룬다. 코드를 분석하거나 효율적인 코드를 작성하는데 도움이된다. 64비트 정수 레지스터의 제공으로 프로그래밍 언어에서 사용 가능한 변수의 폭이 다양해졌다. 32비트 데이터 모델인 ILP32와 함께 64비트 리눅스의 기본 데이터 모델인..

리버싱/ARM 2021.02.15

시스템 레지스터

aarch64에서 시스템 설정은 각 시스템 레지스터를 통해 제어되며, MSR 및 MRS 인스트럭션을 사용하여 접근할 수 있다. aarch64는 코프로세서(coprocessor)를 지원하지 않으므로 ARMv7처럼 CP15 연산을 통한 인터페이스를 제공되지 않는다. 시스템 레지스터의 이름 끝에 붙은 숫자는 해당 레지스터에 접근할 수 있는 가장 낮은 익셉션 레벨을 알려준다. 예를 들어, TTBR0_EL1 레지스터의 값은 x0 레지스터로 읽어올 때는 다음과 같이 인스트럭션을 사용한다. MRS x0, TTBR0_EL1 반대로 x0 레지스터의 값을 TTBR0_EL1 레지스터에 쓸 때는 다음과 같은 인스트럭션을 사용한다. MSR TTBR0_EL1, x0

리버싱/ARM 2021.02.09

aarch64 특수 목적 레지스터

aarch64에서 범용 레지스터와 함께 특수 목적 레지스터들이 제공된다. 레지스터 이름 익셉션 레벨별 특수 목적 레지스터 EL0 EL1 EL2 EL3 ZR(Zero Register) XZR / WZR PC (Program Counter) PC SP (Stack Pointer) SP_EL0 SP_EL1 SP_EL2 SP_EL3 ELR (Exception Link Register) ELR_EL1 ELR_EL2 ELR_EL3 SPSR (Saved Process Status Register) SPSR_EL1 SPSR_EL2 SPSR_EL3 PC (Program Counter) PC 레지스터는 다음에 실행할 인스트럭션의 위치를 저장하는 레지스터다. ARMv8에서 PC 레지스터는 프로그래머가 직접 접근하지 못한다...

리버싱/ARM 2021.02.09

프로세서 상태 레지스터(PSTATE)

PSTATE는 프로세서 상태(Processor STATE) 정보를 제공하는데, aarch64 전용, aarch32 전용, aarch64와 aarch32의 공통 속성으로 구성된다. ARMv7에서 현재 프로세스 정보를 나타내는 CPSR과 1:1 대응하지 않는다. aarch64 전용 이름 타입 설명 D(Debug) 익셉션 마스크 이 비트가 설정되면 디버그 익셉션 발생을 막는다. SP(Stack Pointer selector) 실행 살태 제어 사용할 스택 포인터를 선택한다. 0은 SP_EL0사용하고, 1은 SP_ELx를 사용한다. 공통 이름 타입 설명 N(Negative) 조건 플래그 연산 결과가 음수인 경우 설정 Z(Zero) 조건 플래그 연산 결과가 0인 경우 설정 V(Overflow) 조건 플래그 캐리가 ..

리버싱/ARM 2021.02.09

ARMv8 레지스터

aarch64는 64비트 크기의 범용 레지스터 31개(X0 ~ X30)를 제공한다. ARMv7에서 프로세서 모드(Processor mode)에 따라 제공되었던 별도의 레지스터들이 없어지고 하나의 레지스터 세트를 모든 익셉션 레벨에서 사용 가능하도록 변경한 것이다. 범용 레지스터에 접근할 떄 X0 ~ X30 이라는 이름으로 지정하면 64비트를 모두 사용하고, W0 ~ W30 이라는 이름으로 지정하면 이 중 하위 32비트만 사용한다.

리버싱/ARM 2021.02.09

실행 상태 변경

실행 상태 변경은 현재 익셉션 레벨보다 높은 익셉션 레벨로 진입한 상태에서 원래의 익셉션 레벨로 복귀하는 과정에서 이뤄진다. 단, EL3는 더 높은 익셉션 레벨이 존재하지 않으므로 리셋을 통해 실행 상태를 변경해야 한다. 익셉션이 발생하거나 익셉션에서 복귀할 떄 익셉션 레벨이 동일하게 유지되면 실행 상태를 변경할 수 없다. 실행 상태 변경은 동작 중에 빈번하게 발생할 수 있다. 커널은 64비트, 애플리케이션은 32비트로 동작하는 상황을 예로 들어보자. 커널이 실행될 때는 aarch64로 변경되고, 애플리케이션이 실행될 때는 aarch32로 변경되어야 한다. 하이버파이저가 64비트, 게스트(Guest) OS는 32비트에서 동작하는 경우도 마찬가지다. 실행 상태의 변경에는 제약이 따른다. aarch32로의 ..

리버싱/ARM 2021.02.09

실행 상태

ARMv8 아키텍처에는 aarch64와 aarch32라는 2개의 실행 상태가 정의되어 있다. aarch64 aarch32 특징 64비트 실행 환경 32비트 실행 환경 레지스터 - 64비트 크기의 범용 레지스터 31개 - PC (Program Counter) - SP (Stack Pointer) - ELR (Exception Link Register) - 32비트 크기의 범용 레지스터 13개 - PC (Program Counter) - SP (Stack Pointer) - LR (Link Register) 인스트럭션 세트 A64(32비트 인코딩) A32(ARMv7 지원), T32(Thumb) 주소 방식 64비트 가상 주소 32비트 가상 주소 익셉션 모델 ARMv8 익셉션 모델(EL0 ~ EL3) ARMv7..

리버싱/ARM 2021.02.09

Exception Level 변경

익셉션 레벨이 변경되면 코드 흐름과 권한도 변경되므로 정확한 변경 조건과 과정을 파악하는 것이 중요하다!! 익셉션이 발생하면 같은 익셉션 레벨이나 높은 익셉션 레벨로 이동한다. EL0에서 EL1으로 이동하는 것처럼 높은 익셉션 레벨로 변경하면 소프트웨어 실행 권한도 상승한다. 의도하지 않은 권한 상승이 발생하면 안되기 때문에 익셉션이 발생한 레벨보다 낮은 레벨에서는 익셉션을 받을 수 없다. 특히 EL0는 익셉션 핸들링이 불가능하므로 EL0에서 발생한 익셉션은 EL1 이상의 레벨에서 핸들링해야 한다. Exception 발생 상황 IRQ와 FIQ 인터럽트 시그널 메모리 시스템 abort 정의되지 않은(undefined) 인스트럭션 실행 시스템 콜 보안 모니터나 하이퍼바이저 트랩 익셉션 핸들링이 끝나고 이전 ..

리버싱/ARM 2021.02.09

ARMv8 Exception Model

프로세서를 바라보는 관점이 익셉션 레벨을 기준으로 변경되었다!! 익셉션은 시스템 흐름에서 벗어나 익셉션 핸들러의 처리를 필요로 하는 상태 또는 시스템 이벤트를 말한다. 익셉션 모델은 익셉션 타입과 상태, 프로세서의 익셉션 핸들링 루틴, 익셉션 복귀 등을 정의한다. 프로세서는 4개의 익셉션 레벨(EL0, EL1, EL2, EL3) 중 하나의 레벨에서 동작한다. 모든 익셉션 레벨에서 익셉션이 발생할 수 있다!! 익셉션 레벨이 높을수록 자원에 접근할 수 있는 권한 레벨도 높다!! ARMv7의 특권 레벨(privilege level)이 높을 수록 권한 레벨이 높은 것과 동일한 방식이다. 익셉션 레벨은 해당 레벨에서 동작하는 프로그램을 염두에 두고 디자인되었다. EL0는 유저 애플리케이션 EL1는 커널 EL2는 ..

리버싱/ARM 2021.02.09
반응형