Software Exploit for running
unsigned code on an
SH-4 based platform
|
|
|
|
...
mov r15,r1
add #18,r1
mov.w @r1,r1
mov r1,r2
mov r15,r1
add #-40,r1
mov.l @(44,r1),r1
add r2,r1
mov.b @r1,r2
mov #64,r1
cmp/gt r1,r2
...
// Somewhere in memory
struct record *table[0x500];
// Around 0x800 * 4 bytes later
struct {
void (*do_a)(void);
void (*do_b)(void);
...
} gui_func_ptrs;
// Structure of 12 bytes
struct record {
unsigned int a, b, c;
};
u8 *buffer = malloc(0x4000);
memcpy(buffer, settings_flash, 0x4000);
if(buffer[0] != 'G' || buffer[1] != 'H' ||
buffer[2] != 'E' || buffer[3] != 'S' ||
buffer[4] != 'T') {
return;
}
buffer += 6;
u16 number_of_records = (buffer[0] << 8) |
buffer[1];
u16 total_record_length = (buffer[2] << 8) |
buffer[3];
buffer += 4;
for(i=0; i<number_of_records; i++) {
table[i] = malloc(sizeof(struct record));
}
for(i=0, j=0; i<number_of_records &&
j<total_record_length;
i++, j+=sizeof(struct record))
memcpy(table[i], buffer+j,
sizeof(struct record));
Of course! (sort of :)
10 bytes of exploit code
0: 02 90 mov.w 8Simple jump to 0xA07E_0000, which is part of flash we control,r0 ! a07e 2: 28 40 shll16 r0 4: 0b 40 jsr @r0 6: 09 00 nop 00000008 : 8: 7e a0 bra 108
1da0: aa aa bra 0x12f8
1da2: aa ab bra 0x14fa
???