From 116da355bb755d04bc91301557ea45d148eed215 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Mon, 13 Nov 2017 17:08:41 -0700 Subject: [PATCH 1/2] Fix NRO section addresses --- tools/elf2nro.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/tools/elf2nro.c b/tools/elf2nro.c index b7feb488..0fa9ae74 100644 --- a/tools/elf2nro.c +++ b/tools/elf2nro.c @@ -105,10 +105,9 @@ int main(int argc, char* argv[]) { Elf64_Phdr* phdrs = (Elf64_Phdr*) &elf[hdr->e_phoff]; size_t i, j = 0; - size_t file_off = sizeof(NroHeader) + sizeof(NroStart); + size_t file_off = 0; - uint8_t* comp_buf[3]; - int comp_sz[3]; + uint8_t* buf[3]; for (i=0; i<4; i++) { Elf64_Phdr* phdr = NULL; @@ -131,19 +130,19 @@ int main(int argc, char* argv[]) { break; } - nro_hdr.Segments[i].FileOff = file_off; - nro_hdr.Segments[i].Size = phdr->p_filesz + phdr->p_memsz; - nro_hdr.Segments[i].Size = (nro_hdr.Segments[i].Size + 0xFFF) & ~0xFFF; - comp_buf[i] = malloc(phdr->p_filesz); + nro_hdr.Segments[i].FileOff = phdr->p_vaddr; + nro_hdr.Segments[i].Size = (phdr->p_memsz + 0xFFF) & ~0xFFF; + buf[i] = malloc(nro_hdr.Segments[i].Size); + memset(buf[i], 0, nro_hdr.Segments[i].Size); - if (comp_buf[i] == NULL) { + if (buf[i] == NULL) { fprintf(stderr, "Out of memory!\n"); return EXIT_FAILURE; } - memcpy(comp_buf[i], &elf[phdr->p_offset], phdr->p_filesz); + memcpy(buf[i], &elf[phdr->p_offset], phdr->p_filesz); - file_off += phdr->p_filesz + phdr->p_memsz; + file_off += nro_hdr.Segments[i].Size; file_off = (file_off + 0xFFF) & ~0xFFF; } @@ -157,14 +156,16 @@ int main(int argc, char* argv[]) { nro_hdr.size = file_off; // TODO check retvals - fwrite(&nro_start, sizeof(nro_start), 1, out); - fwrite(&nro_hdr, sizeof(nro_hdr), 1, out); for (i=0; i<3; i++) { fseek(out, nro_hdr.Segments[i].FileOff, SEEK_SET); - fwrite(comp_buf[i], comp_sz[i], 1, out); + fwrite(buf[i], nro_hdr.Segments[i].Size, 1, out); } + fseek(out, 0, SEEK_SET); + fwrite(&nro_start, sizeof(nro_start), 1, out); + fwrite(&nro_hdr, sizeof(nro_hdr), 1, out); + return EXIT_SUCCESS; } From 14b56cd3de83faa151e1ce5a74322b9349ff3c31 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Mon, 13 Nov 2017 17:39:11 -0700 Subject: [PATCH 2/2] Adjust crt0 for NROs --- crt0/switch_crt0.s | 2 ++ tools/elf2nro.c | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/crt0/switch_crt0.s b/crt0/switch_crt0.s index e90897b6..826ccf45 100644 --- a/crt0/switch_crt0.s +++ b/crt0/switch_crt0.s @@ -3,8 +3,10 @@ _start: bl startup + .word 0 .ascii "HOMEBREW" +.org _start+0x80 startup: // get aslr base sub x28, x30, #4 diff --git a/tools/elf2nro.c b/tools/elf2nro.c index 0fa9ae74..f4e84ead 100644 --- a/tools/elf2nro.c +++ b/tools/elf2nro.c @@ -163,8 +163,7 @@ int main(int argc, char* argv[]) { fwrite(buf[i], nro_hdr.Segments[i].Size, 1, out); } - fseek(out, 0, SEEK_SET); - fwrite(&nro_start, sizeof(nro_start), 1, out); + fseek(out, sizeof(nro_start), SEEK_SET); fwrite(&nro_hdr, sizeof(nro_hdr), 1, out); return EXIT_SUCCESS;