Skip to content

Commit 0a55704

Browse files
radaretrufae
authored andcommitted
Fix oobread and unaligned casts in the NE entrypoint logic ##crash
* Reported by @HMsec via huntr.dev * Reproducer: nepocaligns * BountyID: ec538fa4-06c6-4050-a141-f60153ddeaac
1 parent 6d0bf40 commit 0a55704

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

  • libr/bin/format/ne

libr/bin/format/ne/ne.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -408,14 +408,21 @@ RList *r_bin_ne_get_entrypoints(r_bin_ne_obj_t *bin) {
408408
off += 2;
409409
ut8 segnum = *(bin->entry_table + off);
410410
off++;
411-
ut16 segoff = *(ut16 *)(bin->entry_table + off);
412-
if (segnum > 0) {
411+
if (off > bin->ne_header->EntryTableLength) {
412+
break;
413+
}
414+
ut16 segoff = r_read_le16 (bin->entry_table + off);
415+
if (segnum > 0 && segnum < bin->ne_header->SegCount) {
413416
entry->paddr = (ut64)bin->segment_entries[segnum - 1].offset * bin->alignment + segoff;
414417
}
415418
} else { // Fixed
419+
if (off + 2 >= bin->ne_header->EntryTableLength) {
420+
break;
421+
}
422+
ut16 delta = r_read_le16 (bin->entry_table + off);
416423
if (bundle_type < bin->ne_header->SegCount) {
417424
entry->paddr = (ut64)bin->segment_entries[bundle_type - 1].offset
418-
* bin->alignment + *(ut16 *)(bin->entry_table + off);
425+
* bin->alignment + delta;
419426
}
420427
}
421428
off += 2;

0 commit comments

Comments
 (0)