Commit Graph

108 Commits

Author SHA1 Message Date
Pavel I. Kryukov
6a2e8c78b0 Avoid hiding local variable by another local variable in elfio::load_sections 2018-08-25 22:40:00 +03:00
Jingxuan He
4b9ff89770 modify get_ordered_segments 2018-05-05 19:32:49 +03:00
Tobias Klauser
37ebcd91b8 Fix two gcc -Wignored-qualifiers warnings
Fix the following two gcc warnings:

elfio/elfio_section.hpp:50:36: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
     const size_t get_stream_size() const
                                    ^
elfio/elfio_segment.hpp:99:23: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
     get_stream_size() const
2018-05-05 19:30:09 +03:00
alvaro
bc5f17b0fc Fix more NULL dereferences
Crash 7d695153fd8052529d480c2352d4ada33a44bada
2017-10-04 20:47:51 +03:00
alvaro
abab994411 Fix NULL deference for no ELF files
Fix crash 060833f08dc14d1712428742b3cad7af17b36bb7
2017-10-04 20:47:51 +03:00
alvaro
bd5f2128ae Check size for segment
Fix crash b82f05b0b25c8fdc98480e6d76b6d5f9164ae2bc

Running: crash-b82f05b0b25c8fdc98480e6d76b6d5f9164ae2bc
==2850==WARNING: AddressSanitizer failed to allocate 0x400000004000001 bytes
==2850==AddressSanitizer's allocator is terminating the process instead of returning 0
==2850==If you don't like this behavior set allocator_may_return_null=1
==2850==AddressSanitizer CHECK failed: /home/alvaro/tools/llvm/llvm/projects/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cc:22
1 "((0)) != (0)" (0x0, 0x0)
2017-10-04 20:47:51 +03:00
alvaro
1a3cb25a7c Fix oob read terminating data with 0
Fix crash e3c41070342cf84dea077356ddbb8ebf4326a601

==12073==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6110000003bb at pc 0x0000004c234c bp 0x7fcf6359ec30 sp 0x7fcf6359e3
e0
READ of size 11 at 0x6110000003bb thread T0
    #0 0x4c234b in __interceptor_strlen.part.30 /home/alvaro/tools/llvm/llvm/projects/compiler-rt/lib/asan/../sanitizer_common/sanitize
r_common_interceptors.inc:301
    #1 0x7165e6579d87 in std::char_traits<char>::length(char const*) /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3
/include/bits/char_traits.h:269
    #2 0x7165e6579d87 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std
::allocator<char> const&) /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:495
    #3 0x5c3333 in ELFIO::elfio::load_sections(std::istream&) /home/alvaro/fuzzers/elfio/ELFIO/examples/libfuzzer/../../elfio/elfio.hpp
:413:44
2017-10-04 20:47:51 +03:00
alvaro
39f8614f17 Added stream_size into section
This will allow to perform some security checks when reading size values
from ELF file

Fix crash e1ce7cecf01cf800397a4302854d9d76fa19763c
2017-10-04 20:47:51 +03:00
Vašek Potoček
972f89e022 Better support for read-only ELF access 2017-10-04 20:33:10 +03:00
Vašek Potoček
ced83b14be More 386 relocation types 2017-10-04 20:15:53 +03:00
Serge Lamikhov-Center
fbf8eafc2d Permit updating of e_version field of ELF header 2017-03-28 00:35:17 +03:00
Martin Bickel
b4127676ba Fix calculation of section alignment 2017-03-06 22:28:46 +02:00
Martin Bickel
3385408d6b Rephrase condition of is_sect_in_seg() to make it more intuitive 2017-03-06 22:28:46 +02:00
Martin Bickel
fe78d06e81 Segment align updated when saving, not loading
After loading, the data model in memory should resemble the original ELF file as closely as possible,
so that ELF viewers based on elfio will print out the original values, not the calculated ones.
2017-02-18 19:25:21 +02:00
Martin Bickel
6c19078803 Fixed section to segment mapping for 0-length sections 2017-02-18 19:25:21 +02:00
Martin Bickel
d800c7b295 When saving a previously loaded ELF file, don't shrink segments' memory size 2017-01-16 20:38:37 +02:00
Martin Bickel
213dbedac2 Add sanity check when calculating alignment 2017-01-16 20:38:37 +02:00
Martin Bickel
fb5ec079ba new method for validating the loaded ELF file 2017-01-16 20:38:37 +02:00
Martin Bickel
d0cb172474 Expose getter for section.offset 2017-01-16 20:38:37 +02:00
Martin Bickel
a0de1960d6 Check for errors when loading segments 2017-01-16 20:38:37 +02:00
Serge Lamikhov-Center
878247108f Ignore sections of zero size. Thanks to Martin Bickel 2016-12-20 20:11:20 +02:00
Tobias Klauser
446e0c215c elfio_note: fix MSVC compiler warning
Fix the following MSVC compiler warning:

elfio/elfio_note.hpp(77): warning C4267: 'initializing' : conversion from 'size_t' to 'ELFIO::Elf_Word', possible loss of data

by changing the type of max_name_sizei to Elf_Xword, as
note_secton->get_size() returns Elf_Xword and note_start_positions also
contains members of type Elf_Xword.
2016-10-06 12:07:20 +02:00
Tobias Klauser
af4140a122 elfio: don't cast away const qualifiers
Don't cast away const qualifiers when accessing const data (e.g. section
data). This fixes the warnings such as the following when compiling with
GCC and the -Wcast-qual flag set:

warning: cast from type ‘const char*’ to type ‘ELFIO::Elf_Word* {aka unsigned int*}’ casts away qualifiers [-Wcast-qual]
2016-09-22 23:22:39 +03:00
Yutetsu TAKATSUKASA
fb26cf1002 resolve compiler warning by "-Wsign-compare" 2016-09-18 10:44:16 +09:00
Serge Lamikhov-Center
b2525656a5 New e_machine numbers added 2016-07-10 12:36:52 +03:00
Serge Lamikhov-Center
3c5620d46d Make note section entries for 64-bit ELF file be the same as for 32-bit file
There are discrepancies in documentations. SCO documentation
(http://www.sco.com/developers/gabi/latest/ch5.pheader.html#note_section)
requires 8 byte entries alignment for 64-bit ELF file,
but Oracle's definition uses the same structure
for 32-bit and 64-bit formats.
(https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-18048.html)

It looks like EM_X86_64 Linux implementation is similar to Oracle's
definition. Therefore, the same alignment works for both formats
2016-07-10 11:35:23 +03:00
Kevin Klues
e3e0d6dbdb Fixed off-by-one error in 'name' of add_note() function.
Previously, when assigning 'name' as a string, it's length was specified
using the full length of 'namesz'. However, this length includes the
trailing '\0' of the underlying char[]. This ultimately causes the C++
string that is created to (incorrectly) contain the '\0' character as
well. This leads to problems where e.g. the following will return false,
even when 'name' itself actually contains the string "GNU\0":

  if (name == "GNU") {
    return true;
  }
  return false;

To fix this, we should only include the length of the string minus the
trailing '\0'.
2016-07-02 11:02:20 -07:00
Serge Lamikhov-Center
8e7a29e128 Refactoring 2016-04-23 17:58:34 +03:00
Tim Strazzere
ecc45ede27 Prevent accessing pdata struct if it doesn't exist. 2016-04-23 16:37:48 +03:00
Tim Strazzere
88503347da Avoid SIGSEV due to non-existant string section. 2016-04-23 16:37:48 +03:00
Tim Strazzere
812f7299b3 Avoid SIGABRT due to over allocating during new instance of objects. 2016-04-23 16:37:48 +03:00
Serge Lamikhov-Center
69b6177bd6 Make '.shstrtab' section be explicitly aligned to 1 2015-09-26 15:01:56 +03:00
Serge Lamikhov-Center
f2e17bac87 Fix offset calculation for the case where section's align field is zero 2015-09-26 11:07:26 +03:00
Serge Lamikhov-Center
3429026ab7 Include <iterator> header file 2015-08-22 20:04:02 +03:00
Serge Lamikhov-Center
b88df7bda8 The list of machine architectures was updated 2015-04-30 18:16:03 +03:00
Serge Lamikhov-Center
5ec1fc8949 Prevent a crash when working with MN10300 ELF file 2015-02-25 00:57:51 +02:00
Serge Lamikhov-Center
c45e81fd32 String section accessor refactoring 2015-02-21 13:50:32 +02:00
Serge Lamikhov-Center
9e4502d90e Copyright year update 2015-02-13 20:51:07 +02:00
Serge Lamikhov-Center
8290078a64 Relocation entry endianness fix; Warnings elimination 2015-02-13 20:47:37 +02:00
Mario Werner
91e61ec4b2 use the NULL section instead of offset == 0
This change makes it possible to use the regular API to build up
elf files which include the file header.
2014-12-03 10:38:44 +01:00
Mario Werner
d2a27c7d96 initialized a few variables to silence warnings when building with Wall 2014-12-03 09:45:21 +01:00
Mario Werner
1676247836 fix alignment of segments during saving -> copied elfs are working
The old implementation aligned the segment start. However, the
intended behaviour is to align the offset and the vaddr
(p_vaddr % p_align == p_offset % p_align). This is required for the
loader which can then operate on memory pages.
2014-12-03 09:27:56 +01:00
Mario Werner
fe0c85995d add 4 byte alignment for the section table
this is probably not required but definitely does not hurt
2014-12-03 09:24:21 +01:00
Serge Lamikhov-Center
1db119a8ca Refactoring - a nicer code for is_subsequence_of()
Conflicts:
	elf_examples/asm_copy
2014-11-23 00:53:19 +02:00
Mario Werner
b91a43b378 special support for PHDR segments and segments which include the elf header
Only elf files with strange GNU_RELRO segments fail the load, save, cycle.

It would maybe a good idea to separate the layout functionality from the
current save. The current coupling of layout and save make it
impossible to build layouts which contain the elf header via the public
API.
2014-11-15 22:08:52 +01:00
Mario Werner
755b92c580 move the section table to the end of the elf file 2014-11-14 13:40:25 +01:00
Mario Werner
c743d0bf74 separated layout generation and saving
Many example elfs (hello_32, hello_64, asm ...) require that the
first section directly follows the program header table. The
section header is then placed between segments or at the end.

This change prepares the late placement of section header table.
2014-11-14 13:06:39 +01:00
Mario Werner
55c2841e47 changed order in which the sections are emitted
The fact that segments can contain header information as well as
sections requires that sections within segments are emitted first.
2014-11-14 10:37:50 +01:00
Mario Werner
0ece76b5eb rewrote the segment save logic to not only care about alignment
The initial implementation only made sure that all sections and segments
are properly aligned. This is enough for simple embedded applications
but can not deal with more complex layouts.

The new implementation should be more generic given that it respects the
virtual addresses of the individual sections.

One thing which is currently not supported by this rewrite are segments
which contain the program/segment header or even the whole elf header.
2014-11-14 08:27:36 +01:00
Mario Werner
e5592ddfdd fix: make segment loading similar to readelf's algorithm
ALLOC sections are now matched against the virtual address space of
the segment. Non ALLOC sections still use the offset approach.
2014-11-14 08:04:55 +01:00