From 499f00977cd7f50ce0c4cf24dd59b1e920e5b180 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 15 Mar 2017 19:17:57 +0100 Subject: Checked the remaining space before inserting new instructions. --- ChangeLog | 5 +++++ src/analysis/disass/area.c | 24 ++++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index d4f605c..b309cc1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 17-03-15 Cyrille Bagard + * src/analysis/disass/area.c: + Check the remaining space before inserting new instructions. + +17-03-15 Cyrille Bagard + * src/arch/arm/v7/fetch.c: * src/arch/arm/v7/link.c: Update code. diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index 6698bb3..bdfb1b2 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -407,7 +407,25 @@ static GArchInstruction *load_raw_instruction_from_mem_area(mem_area *area, phys sz = area->packing_size; - if (get_virt_addr(pos) % sz == 0 && is_range_blank_in_mem_area(area, offset, sz)) + /** + * Une vérification est effectuée en amont pour garantir qu'il existe + * toujours au moins un octet à traiter. + * + * Si on veut en manipuler plus d'un, aucune vérification en amont ne s'occupe + * du cas où on dépasse les limites de la zone lors des tests de marquage. + * + * D'habitude, c'est la création préalable d'une instruction, via la lecture + * du contenu binaire restreint, qui part en échec et qui fait qu'on ne teste + * pas la zone sur un espace hors champ. + * + * Ce test est effectué avant la création d'une instruction ici (et c'est le + * seul endroit dans ce cas de figure), donc il faut faire les vérifications + * de débordement avant tout ! + */ + + if (get_virt_addr(pos) % sz == 0 + && (offset + sz) <= get_mrange_length(&area->range) + && is_range_blank_in_mem_area(area, offset, sz)) { *size = sz; @@ -697,12 +715,10 @@ static void load_data_from_mem_area(mem_area *area, GProcContext *ctx, const vmp if (!is_range_blank_in_mem_area(area, i, 1)) break; - instr = NULL; + /* Décodage d'une nouvelle instruction, sur mesure puis minimale */ copy_vmpa(&prev, &pos); - /* Décodage d'une nouvelle instruction, sur mesure puis minimale */ - instr = load_raw_instruction_from_mem_area(area, i, &pos, &diff); /* On rencontre ici un morceau déjà traité. */ -- cgit v0.11.2-87-g4458