From e6547ea9d59a88840c27d1f57978427492f3098e Mon Sep 17 00:00:00 2001 From: Nikita Strygin Date: Tue, 30 Nov 2021 22:50:08 +0300 Subject: [PATCH] Rewrite elf serialization from xor to BytesIO - This implementation errors out if any intersecting regions are detected instead of silently xor'ing them. (Is there even point in doing anything else?) - It is much faster due to lower time complexity: O(n) vs O(n^2) --- makeelf/elfstruct.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/makeelf/elfstruct.py b/makeelf/elfstruct.py index 8892be2..d99ebda 100755 --- a/makeelf/elfstruct.py +++ b/makeelf/elfstruct.py @@ -7,6 +7,7 @@ from makeelf.type.uint16 import uint16 from makeelf.type.uint32 import uint32 import makeelf.utils +from io import BytesIO ## \class ELFCLASS # \brief File class @@ -884,8 +885,17 @@ def __bytes__(self): end_of_file = sorted(headers.keys())[-1] end_of_file += len(headers[end_of_file]) + b = BytesIO(bytes(end_of_file)) + + regions = list() + + # check if two half segments [x1, x2) and [y1; y2) intersect + def segments_intersect(x, y): + x1, x2 = x + y1, y2 = y + return x2 > y1 and y2 > x1 + # create and populate buffer - b = bytes(end_of_file) for off in headers: # TODO: there's something wrong, when hdr is not bytes, but only # simulates it @@ -899,12 +909,20 @@ def __bytes__(self): hdr = bytes(hdr) size = len(hdr) + region = (off, off + size) + if any(segments_intersect(x, region) for x in regions): + raise Exception('Attempt to write at intersecting parts of a file') + regions.append(region) + + b.seek(off) + b.write(hdr) + # expand to file size - aligned = align(bytes(off) + hdr, end_of_file) + #aligned = align(bytes(off) + hdr, end_of_file) # xor into b - b = makeelf.utils.bytes_xor(b, aligned) - return b + #b = makeelf.utils.bytes_xor(b, aligned) + return b.getvalue() ## # \brief Deserialization of object