Added a generic payload entry point to support async execution

This commit is contained in:
2020-02-11 14:38:21 -05:00
parent 80fd4f6b4c
commit 637fd548f5
8 changed files with 145 additions and 43 deletions

View File

@@ -20,13 +20,14 @@ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
foreach(NAME ${PL_NAMES}) foreach(NAME ${PL_NAMES})
if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.S) if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.S)
add_executable(payload_${NAME} ${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.c add_executable(payload_${NAME} ${CMAKE_CURRENT_LIST_DIR}/payload_entry.c
${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.c
${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.S) ${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.S)
else() else()
add_executable(payload_${NAME} ${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.c) add_executable(payload_${NAME} ${CMAKE_CURRENT_LIST_DIR}/payload_entry.c
${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.c)
endif() endif()
target_link_libraries(payload_${NAME} bootrom_dev)
add_custom_command(TARGET payload_${NAME} POST_BUILD add_custom_command(TARGET payload_${NAME} POST_BUILD
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/bin/payload_${NAME}.bin BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/bin/payload_${NAME}.bin
COMMAND ${CMAKE_OBJCOPY} COMMAND ${CMAKE_OBJCOPY}

View File

@@ -0,0 +1,28 @@
#include "dev_util.h"
extern uint64_t entry_sync(uint64_t *args);
extern uint64_t entry_async(uint64_t *base);
TEXT_SECTION
uint64_t _start(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3,
uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7)
{
uint64_t entry, args[8];
__asm__ volatile ("mov %0, x30" : "=r" (entry));
if(entry == 0xbea /* todo: correct entry */)
{
args[0] = arg0;
args[1] = arg1;
args[2] = arg2;
args[3] = arg3;
args[4] = arg4;
args[5] = arg5;
args[6] = arg6;
args[7] = arg7;
return entry_sync(args);
}
else
return entry_async((uint64_t *) arg0);
}

View File

@@ -1,22 +1,32 @@
#include "bootrom_func.h" #include "bootrom_func.h"
TEXT_SECTION PAYLOAD_SECTION
int _start(void *src, void *dst, void *key, int rep) uint64_t entry_sync(uint64_t *args)
{ {
int i, j; int i, j;
unsigned char src_data[16]; unsigned char src_data[16];
unsigned char *src = (unsigned char *) args[0];
unsigned char *dst = (unsigned char *) args[1];
unsigned char *key = (unsigned char *) args[2];
int rep = (int) args[3];
for(j = 0; j < 16; j++) for(j = 0; j < 16; j++)
{ {
src_data[j] = ((unsigned char *) src)[j]; src_data[j] = src[j];
} }
// task_sleep(100);
for(i = 0; i < rep; i++) for(i = 0; i < rep; i++)
{ {
if(i % 2 == 0) hardware_aes(16, src_data, dst, 16, 0, key, 0); if(i % 2 == 0) hardware_aes(16, src_data, dst, 16, 0, key, 0);
else hardware_aes(16, dst, src_data, 16, 0, key, 0); else hardware_aes(16, dst, src_data, 16, 0, key, 0);
// task_sleep(15);
} }
return 0;
}
PAYLOAD_SECTION
uint64_t entry_async(uint64_t *base)
{
return 0; return 0;
} }

View File

@@ -140,14 +140,18 @@ void aes128_encrypt_ecb(unsigned char *msg, unsigned int msg_len, unsigned char
} }
} }
TEXT_SECTION PAYLOAD_SECTION
unsigned long long _start(unsigned char *msg, unsigned int msg_len, unsigned char *key, uint64_t entry_sync(uint64_t *args)
unsigned char sbox[16][16], unsigned char rc_lookup[11],
unsigned char mul2[256], unsigned char mul3[256])
{ {
unsigned long long start = 0, end = 0; unsigned long long start = 0, end = 0;
unsigned long long timer_deadline_enter = 0x10000b874;
unsigned long long halt = 0x1000004fc; unsigned char *msg = (unsigned char *) args[0];
unsigned int msg_len = (unsigned int) args[1];
unsigned char *key = (unsigned char *) args[2];
unsigned char *sbox = (unsigned char *) args[3];
unsigned char *rc_lookup = (unsigned char *) args[4];
unsigned char *mul2 = (unsigned char *) args[5];
unsigned char *mul3 = (unsigned char *) args[6];
__asm__ volatile ("mrs %0, cntpct_el0" : "=r" (start)); __asm__ volatile ("mrs %0, cntpct_el0" : "=r" (start));
aes128_encrypt_ecb(msg, msg_len, key, sbox, rc_lookup, mul2, mul3); aes128_encrypt_ecb(msg, msg_len, key, sbox, rc_lookup, mul2, mul3);
@@ -160,4 +164,35 @@ unsigned long long _start(unsigned char *msg, unsigned int msg_len, unsigned cha
} }
return end - start; return end - start;
}
PAYLOAD_SECTION
uint64_t entry_async(uint64_t *base)
{
unsigned long long start = 0, end = 0;
unsigned char *msg = (unsigned char *) base[0];
unsigned int msg_len = (unsigned int) base[1];
unsigned char *key = (unsigned char *) base[2];
unsigned char *sbox = (unsigned char *) base[3];
unsigned char *rc_lookup = (unsigned char *) base[4];
unsigned char *mul2 = (unsigned char *) base[5];
unsigned char *mul3 = (unsigned char *) base[6];
base[0] = 0;
while(1)
{
__asm__ volatile ("mrs %0, cntpct_el0" : "=r" (start));
aes128_encrypt_ecb(msg, msg_len, key, sbox, rc_lookup, mul2, mul3);
__asm__ volatile ("mrs %0, cntpct_el0" : "=r" (end));
if(2 * end - start - 64 > 0)
{
timer_register_int(2 * end - start - 64);
wfi();
}
base[0]++;
if(base[0] % 100000 == 0) task_resched();
}
} }

View File

@@ -39,8 +39,7 @@ void fix_heap()
check_all_chksums(); check_all_chksums();
} }
TEXT_SECTION extern uint64_t entry_sync(uint64_t *args)
void _start(unsigned long long *ptr_self)
{ {
fix_heap(); fix_heap();
@@ -48,5 +47,10 @@ void _start(unsigned long long *ptr_self)
*(ADDR_DFU_STATUS) = 1; *(ADDR_DFU_STATUS) = 1;
event_notify(ADDR_DFU_EVENT); event_notify(ADDR_DFU_EVENT);
dev_free(ptr_self); return 0;
}
extern uint64_t entry_async(uint64_t *base)
{
return 0;
} }

View File

@@ -1,32 +1,30 @@
#include "bootrom_func.h" #include "bootrom_func.h"
extern unsigned long long fs_routine(void); extern uint64_t fs_routine(void);
extern uint64_t fs_load(float *dividend, int divisor_base);
// extern uint64_t check_subnormal();
extern unsigned long long fs_load(float *dividend, int divisor_base); //PAYLOAD_SECTION
// extern unsigned long long check_subnormal(); //unsigned int is_subnormal(float val)
//{
// unsigned int bytes = *((unsigned int *) &val);
// bytes = bytes >> 23u;
//
// if(bytes & 0x7u)
// {
// return 0;
// }
// else return 1;
//}
PAYLOAD_SECTION PAYLOAD_SECTION
unsigned int is_subnormal(float val) uint64_t floppysleep_iteration(float *init)
{
unsigned int bytes = *((unsigned int *) &val);
bytes = bytes >> 23u;
if(bytes & 0x7u)
{
return 0;
}
else return 1;
}
TEXT_SECTION
unsigned long long _start(float *init_a)
{ {
int i; int i;
volatile int j = 0; uint64_t start, end, report;
unsigned long long start, end, report;
__asm__ volatile ("isb\n\rmrs %0, cntpct_el0" : "=r" (start)); __asm__ volatile ("isb\n\rmrs %0, cntpct_el0" : "=r" (start));
fs_load(init_a, 1); fs_load(init, 1);
for(i = 0; i < 8; i++) fs_routine(); for(i = 0; i < 8; i++) fs_routine();
__asm__ volatile ("isb\n\rmrs %0, cntpct_el0" : "=r" (end)); __asm__ volatile ("isb\n\rmrs %0, cntpct_el0" : "=r" (end));
@@ -37,7 +35,26 @@ unsigned long long _start(float *init_a)
} }
__asm__ volatile ("isb\n\rmrs %0, cntpct_el0" : "=r" (report)); __asm__ volatile ("isb\n\rmrs %0, cntpct_el0" : "=r" (report));
j++;
return end - start; return end - start;
} }
PAYLOAD_SECTION
uint64_t entry_sync(uint64_t *args)
{
return floppysleep_iteration((float *) args[0]);
}
PAYLOAD_SECTION
uint64_t entry_async(uint64_t *args)
{
float *init_ptr = (float *) args[0];
args[0] = 0;
while(1)
{
floppysleep_iteration(init_ptr);
args[0]++;
if(args[0] % 100000 == 0) task_resched();
}
}

View File

@@ -1,10 +1,18 @@
#include "dev_util.h" #include "dev_util.h"
TEXT_SECTION PAYLOAD_SECTION
void _start() extern uint64_t entry_sync(uint64_t *args)
{ {
__asm__("dmb sy"); __asm__("dmb sy");
__asm__("ic iallu"); __asm__("ic iallu");
__asm__("dsb sy"); __asm__("dsb sy");
__asm__("isb"); __asm__("isb");
return 0;
}
PAYLOAD_SECTION
extern uint64_t entry_async(uint64_t *base)
{
return 0;
} }

View File

@@ -332,7 +332,6 @@ void usb_task_exit(struct pwned_device *dev)
int main() int main()
{ {
struct dev_cmd_resp *resp;
struct pwned_device *dev = exploit_device(); struct pwned_device *dev = exploit_device();
if(dev == NULL || dev->status == DEV_NORMAL) if(dev == NULL || dev->status == DEV_NORMAL)
{ {