Merge branch 'dev' into s390x
This commit is contained in:
@ -325,6 +325,8 @@ static void test_arm_usr32_to_svc32()
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
r_sp = 0x12345678;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_SP, &r_sp));
|
||||
r_lr = 0x00102220;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_LR, &r_lr));
|
||||
|
||||
r_cpsr = 0x4000009b; // UND32
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
@ -332,18 +334,28 @@ static void test_arm_usr32_to_svc32()
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_SPSR, &r_spsr));
|
||||
r_sp = 0xDEAD0000;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_SP, &r_sp));
|
||||
r_lr = code_start + 8;
|
||||
r_lr = 0x00509998;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_LR, &r_lr));
|
||||
|
||||
OK(uc_reg_read(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
TEST_CHECK((r_cpsr & ((1 << 4) - 1)) == 0xb); // We are in UND32
|
||||
|
||||
r_cpsr = 0x40000090; // USR32
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
r_sp = 0x0010000;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_R13, &r_sp));
|
||||
r_lr = 0x0001234;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_LR, &r_lr));
|
||||
|
||||
OK(uc_reg_read(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
TEST_CHECK((r_cpsr & ((1 << 4) - 1)) == 0); // We are in USR32
|
||||
|
||||
r_cpsr = 0x40000093; // SVC32
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
|
||||
OK(uc_reg_read(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
OK(uc_reg_read(uc, UC_ARM_REG_SP, &r_sp));
|
||||
TEST_CHECK((r_cpsr & ((1 << 4) - 1)) == 3); // We are in SVC32
|
||||
TEST_CHECK(r_sp == 0x12345678);
|
||||
|
||||
OK(uc_close(uc));
|
||||
@ -398,6 +410,67 @@ static void test_arm_thumb_smlabb()
|
||||
OK(uc_close(uc));
|
||||
}
|
||||
|
||||
static void test_arm_not_allow_privilege_escalation()
|
||||
{
|
||||
uc_engine *uc;
|
||||
int r_cpsr, r_sp, r_spsr, r_lr;
|
||||
// E3C6601F : BIC r6, r6, #&1F
|
||||
// E3866013 : ORR r6, r6, #&13
|
||||
// E121F006 : MSR cpsr_c, r6 ; switch to SVC32 (should be ineffective
|
||||
// from USR32)
|
||||
// E1A00000 : MOV r0,r0 EF000011 : SWI OS_Exit
|
||||
char code[] = "\x1f\x60\xc6\xe3\x13\x60\x86\xe3\x06\xf0\x21\xe1\x00\x00\xa0"
|
||||
"\xe1\x11\x00\x00\xef";
|
||||
|
||||
uc_common_setup(&uc, UC_ARCH_ARM, UC_MODE_ARM, code, sizeof(code) - 1,
|
||||
UC_CPU_ARM_CORTEX_A15);
|
||||
|
||||
// https://www.keil.com/pack/doc/CMSIS/Core_A/html/group__CMSIS__CPSR.html
|
||||
r_cpsr = 0x40000013; // SVC32
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
r_spsr = 0x40000013;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_SPSR, &r_spsr));
|
||||
r_sp = 0x12345678;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_SP, &r_sp));
|
||||
r_lr = 0x00102220;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_LR, &r_lr));
|
||||
|
||||
r_cpsr = 0x40000010; // USR32
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
r_sp = 0x0010000;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_SP, &r_sp));
|
||||
r_lr = 0x0001234;
|
||||
OK(uc_reg_write(uc, UC_ARM_REG_LR, &r_lr));
|
||||
|
||||
uc_assert_err(
|
||||
UC_ERR_EXCEPTION,
|
||||
uc_emu_start(uc, code_start, code_start + sizeof(code) - 1, 0, 0));
|
||||
|
||||
OK(uc_reg_read(uc, UC_ARM_REG_SP, &r_sp));
|
||||
OK(uc_reg_read(uc, UC_ARM_REG_LR, &r_lr));
|
||||
OK(uc_reg_read(uc, UC_ARM_REG_CPSR, &r_cpsr));
|
||||
|
||||
TEST_CHECK((r_cpsr & ((1 << 4) - 1)) == 0); // Stay in USR32
|
||||
TEST_CHECK(r_lr == 0x1234);
|
||||
TEST_CHECK(r_sp == 0x10000);
|
||||
|
||||
OK(uc_close(uc));
|
||||
}
|
||||
|
||||
static void test_arm_mrc()
|
||||
{
|
||||
uc_engine *uc;
|
||||
// mrc p15, #0, r0, c1, c1, #0
|
||||
char code[] = "\x11\x0F\x11\xEE";
|
||||
|
||||
uc_common_setup(&uc, UC_ARCH_ARM, UC_MODE_ARM, code, sizeof(code) - 1,
|
||||
UC_CPU_ARM_MAX);
|
||||
|
||||
OK(uc_emu_start(uc, code_start, code_start + sizeof(code) - 1, 0, 0));
|
||||
|
||||
OK(uc_close(uc));
|
||||
}
|
||||
|
||||
TEST_LIST = {{"test_arm_nop", test_arm_nop},
|
||||
{"test_arm_thumb_sub", test_arm_thumb_sub},
|
||||
{"test_armeb_sub", test_armeb_sub},
|
||||
@ -410,4 +483,7 @@ TEST_LIST = {{"test_arm_nop", test_arm_nop},
|
||||
{"test_arm_usr32_to_svc32", test_arm_usr32_to_svc32},
|
||||
{"test_arm_v8", test_arm_v8},
|
||||
{"test_arm_thumb_smlabb", test_arm_thumb_smlabb},
|
||||
{"test_arm_not_allow_privilege_escalation",
|
||||
test_arm_not_allow_privilege_escalation},
|
||||
{"test_arm_mrc", test_arm_mrc},
|
||||
{NULL, NULL}};
|
@ -4,9 +4,10 @@ const uint64_t code_start = 0x1000;
|
||||
const uint64_t code_len = 0x4000;
|
||||
|
||||
static void uc_common_setup(uc_engine **uc, uc_arch arch, uc_mode mode,
|
||||
const char *code, uint64_t size)
|
||||
const char *code, uint64_t size, uc_cpu_arm cpu)
|
||||
{
|
||||
OK(uc_open(arch, mode, uc));
|
||||
OK(uc_ctl_set_cpu_model(*uc, cpu));
|
||||
OK(uc_mem_map(*uc, code_start, code_len, UC_PROT_ALL));
|
||||
OK(uc_mem_write(*uc, code_start, code, size));
|
||||
}
|
||||
@ -27,7 +28,8 @@ static void test_arm64_until()
|
||||
uint64_t r_pc = 0x00000000;
|
||||
uint64_t r_x28 = 0x12341234;
|
||||
|
||||
uc_common_setup(&uc, UC_ARCH_ARM64, UC_MODE_ARM, code, sizeof(code) - 1);
|
||||
uc_common_setup(&uc, UC_ARCH_ARM64, UC_MODE_ARM, code, sizeof(code) - 1,
|
||||
UC_CPU_AARCH64_A72);
|
||||
|
||||
// initialize machine registers
|
||||
OK(uc_reg_write(uc, UC_ARM64_REG_X16, &r_x16));
|
||||
@ -54,7 +56,8 @@ static void test_arm64_code_patching()
|
||||
{
|
||||
uc_engine *uc;
|
||||
char code[] = "\x00\x04\x00\x11"; // add w0, w0, 0x1
|
||||
uc_common_setup(&uc, UC_ARCH_ARM64, UC_MODE_ARM, code, sizeof(code) - 1);
|
||||
uc_common_setup(&uc, UC_ARCH_ARM64, UC_MODE_ARM, code, sizeof(code) - 1,
|
||||
UC_CPU_AARCH64_A72);
|
||||
// zero out x0
|
||||
uint64_t r_x0 = 0x0;
|
||||
OK(uc_reg_write(uc, UC_ARM64_REG_X0, &r_x0));
|
||||
@ -83,7 +86,8 @@ static void test_arm64_code_patching_count()
|
||||
{
|
||||
uc_engine *uc;
|
||||
char code[] = "\x00\x04\x00\x11"; // add w0, w0, 0x1
|
||||
uc_common_setup(&uc, UC_ARCH_ARM64, UC_MODE_ARM, code, sizeof(code) - 1);
|
||||
uc_common_setup(&uc, UC_ARCH_ARM64, UC_MODE_ARM, code, sizeof(code) - 1,
|
||||
UC_CPU_AARCH64_A72);
|
||||
// zero out x0
|
||||
uint64_t r_x0 = 0x0;
|
||||
OK(uc_reg_write(uc, UC_ARM64_REG_X0, &r_x0));
|
||||
@ -109,7 +113,33 @@ static void test_arm64_code_patching_count()
|
||||
OK(uc_close(uc));
|
||||
}
|
||||
|
||||
static void test_arm64_v8_pac()
|
||||
{
|
||||
uc_engine *uc;
|
||||
char code[] = "\x28\xfd\xea\xc8"; // casal x10, x8, [x9]
|
||||
uint64_t r_x9, r_x8, mem;
|
||||
|
||||
uc_common_setup(&uc, UC_ARCH_ARM64, UC_MODE_ARM, code, sizeof(code) - 1,
|
||||
UC_CPU_AARCH64_MAX);
|
||||
|
||||
OK(uc_mem_map(uc, 0x40000, 0x1000, UC_PROT_ALL));
|
||||
OK(uc_mem_write(uc, 0x40000, "\x00\x00\x00\x00\x00\x00\x00\x00", 8));
|
||||
r_x9 = 0x40000;
|
||||
OK(uc_reg_write(uc, UC_ARM64_REG_X9, &r_x9));
|
||||
r_x8 = 0xdeadbeafdeadbeaf;
|
||||
OK(uc_reg_write(uc, UC_ARM64_REG_X8, &r_x8));
|
||||
|
||||
OK(uc_emu_start(uc, code_start, code_start + sizeof(code) - 1, 0, 0));
|
||||
|
||||
OK(uc_mem_read(uc, 0x40000, (void *)&mem, 8));
|
||||
|
||||
TEST_CHECK(mem == r_x8);
|
||||
|
||||
OK(uc_close(uc));
|
||||
}
|
||||
|
||||
TEST_LIST = {{"test_arm64_until", test_arm64_until},
|
||||
{"test_arm64_code_patching", test_arm64_code_patching},
|
||||
{"test_arm64_code_patching_count", test_arm64_code_patching_count},
|
||||
{"test_arm64_v8_pac", test_arm64_v8_pac},
|
||||
{NULL, NULL}};
|
||||
|
@ -34,4 +34,35 @@ static void test_ppc32_add()
|
||||
OK(uc_close(uc));
|
||||
}
|
||||
|
||||
TEST_LIST = {{"test_ppc32_add", test_ppc32_add}, {NULL, NULL}};
|
||||
// https://www.ibm.com/docs/en/aix/7.2?topic=set-fadd-fa-floating-add-instruction
|
||||
static void test_ppc32_fadd()
|
||||
{
|
||||
uc_engine *uc;
|
||||
char code[] = "\xfc\xc4\x28\x2a"; // fadd 6, 4, 5
|
||||
uint32_t r_msr;
|
||||
uint64_t r_fpr4, r_fpr5, r_fpr6;
|
||||
|
||||
uc_common_setup(&uc, UC_ARCH_PPC, UC_MODE_32 | UC_MODE_BIG_ENDIAN, code,
|
||||
sizeof(code) - 1);
|
||||
|
||||
OK(uc_reg_read(uc, UC_PPC_REG_MSR, &r_msr));
|
||||
r_msr |= (1 << 13); // Big endian
|
||||
OK(uc_reg_write(uc, UC_PPC_REG_MSR, &r_msr)); // enable FP
|
||||
|
||||
r_fpr4 = 0xC053400000000000ul;
|
||||
r_fpr5 = 0x400C000000000000ul;
|
||||
OK(uc_reg_write(uc, UC_PPC_REG_FPR4, &r_fpr4));
|
||||
OK(uc_reg_write(uc, UC_PPC_REG_FPR5, &r_fpr5));
|
||||
|
||||
OK(uc_emu_start(uc, code_start, code_start + sizeof(code) - 1, 0, 0));
|
||||
|
||||
OK(uc_reg_read(uc, UC_PPC_REG_FPR6, &r_fpr6));
|
||||
|
||||
TEST_CHECK(r_fpr6 == 0xC052600000000000ul);
|
||||
|
||||
OK(uc_close(uc));
|
||||
}
|
||||
|
||||
TEST_LIST = {{"test_ppc32_add", test_ppc32_add},
|
||||
{"test_ppc32_fadd", test_ppc32_fadd},
|
||||
{NULL, NULL}};
|
Reference in New Issue
Block a user