[Crash-utility] [PATCH] Automatically detect kernel aslr offset
Andrew Honig
ahonig at google.com
Wed Feb 19 16:39:03 UTC 2014
Yes it should. Good catch.
On Feb 19, 2014 7:58 AM, "Kurtis Rader" <krader at skepticism.us> wrote:
> Shouldn't the mask in this block of code be "relocate & 0xFFF"?
>
> + *To avoid mistaking an mismatched kernel version
> with
> + * a kaslr offset, we make sure that the offset is
> + * aligned by 0x1000, as it always will be for
> + * kaslr.
> + */
> + if ((relocate & 0x1000) == 0) {
> + kt->relocate = relocate;
> + kt->flags |= RELOC_SET;
> + }
>
>
> On Tue, Feb 18, 2014 at 4:56 PM, Andy Honig <ahonig at google.com> wrote:
>
>> Automatically detext kernel aslr offset
>>
>> This patch improves support for kernel aslr, to automatically find the
>> aslr offset based on the location of the _stext symbol in the vmcore
>> info.
>>
>> Signed-off-by: Andrew Honig <ahonig at google.com>
>> ---
>> netdump.c | 19 ++++++++-----------
>> symbols.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++---
>> 2 files changed, 54 insertions(+), 14 deletions(-)
>>
>> diff --git a/netdump.c b/netdump.c
>> index 8e7ec15..b327649 100644
>> --- a/netdump.c
>> +++ b/netdump.c
>> @@ -411,18 +411,15 @@ is_netdump(char *file, ulong source_query)
>> get_log_from_vmcoreinfo(file, vmcoreinfo_read_string);
>> }
>>
>> - // This is the code where I should read the aslr offset.
>> + /*
>> + *We may need the _stext_SYMBOL from the vmcore_info to adjust for
>> + * kaslr and we may not have gotten it elsewhere.
>> + */
>> if (source_query == KDUMP_LOCAL) {
>> - long aslr_offset = 0;
>> - char *aslr_string =
>> vmcoreinfo_read_string("KERNELOFFSET");
>> - if (aslr_string) {
>> - aslr_offset = strtoul(aslr_string, NULL, 16);
>> - free (aslr_string);
>> - }
>> - if (!(kt->flags & RELOC_SET) && aslr_offset > 0) {
>> - kt->flags |= RELOC_SET;
>> - kt->relocate=aslr_offset * -1;
>> - }
>> + char *tmpstring =
>> vmcoreinfo_read_string("SYMBOL(_stext)");
>> + kt->vmcoreinfo._stext_SYMBOL =
>> + htol(tmpstring, RETURN_ON_ERROR, NULL);
>> + free(tmpstring);
>> }
>>
>> return nd->header_size;
>> diff --git a/symbols.c b/symbols.c
>> index d5f8199..afe5ed0 100755
>> --- a/symbols.c
>> +++ b/symbols.c
>> @@ -553,6 +553,43 @@ strip_symbol_end(const char *name, char *buf)
>> }
>>
>> /*
>> + * Derives the kernel aslr offset by comparing the _stext symbol from the
>> + * the vmcore_info in the dump file to the _stext symbol in the vmlinux
>> file.
>> + */
>> +static void
>> +derive_kaslr_offset(bfd *abfd, int dynamic, bfd_byte *start, bfd_byte
>> *end,
>> + unsigned int size, asymbol *store)
>> +{
>> + symbol_info syminfo;
>> + asymbol *sym;
>> + char *name;
>> + unsigned long relocate;
>> + char buf[BUFSIZE];
>> +
>> + for (; start < end; start += size) {
>> + sym = bfd_minisymbol_to_symbol(abfd, dynamic, start,
>> store);
>> + if (sym == NULL)
>> + error(FATAL, "bfd_minisymbol_to_symbol()
>> failed\n");
>> +
>> + bfd_get_symbol_info(abfd, sym, &syminfo);
>> + name = strip_symbol_end(syminfo.name, buf);
>> + if (strcmp("_stext", name) == 0) {
>> + relocate = syminfo.value -
>> kt->vmcoreinfo._stext_SYMBOL;
>> + /*
>> + *To avoid mistaking an mismatched kernel version
>> with
>> + * a kaslr offset, we make sure that the offset is
>> + * aligned by 0x1000, as it always will be for
>> + * kaslr.
>> + */
>> + if ((relocate & 0x1000) == 0) {
>> + kt->relocate = relocate;
>> + kt->flags |= RELOC_SET;
>> + }
>> + }
>> + }
>> +}
>> +
>> +/*
>> * Store the symbols gathered by symtab_init(). The symbols are stored
>> * in increasing numerical order.
>> */
>> @@ -588,15 +625,21 @@ store_symbols(bfd *abfd, int dynamic, void
>> *minisyms, long symcount,
>> st->symcnt = 0;
>> sp = st->symtable;
>>
>> + first = 0;
>> + from = (bfd_byte *) minisyms;
>> + fromend = from + symcount * size;
>> +
>> if (machine_type("X86") || machine_type("X86_64")) {
>> + /* If kernel aslr offset has not been set, try to guess
>> it. */
>> + if (kt->relocate == 0)
>> + derive_kaslr_offset(abfd, dynamic, from,
>> + fromend, size, store);
>> +
>> if (!(kt->flags & RELOC_SET))
>> kt->flags |= RELOC_FORCE;
>> } else
>> kt->flags &= ~RELOC_SET;
>>
>> - first = 0;
>> - from = (bfd_byte *) minisyms;
>> - fromend = from + symcount * size;
>> for (; from < fromend; from += size)
>> {
>> if ((sym = bfd_minisymbol_to_symbol(abfd, dynamic, from,
>> store))
>> --
>> 1.9.0.rc1.175.g0b1dcb5
>>
>> --
>> Crash-utility mailing list
>> Crash-utility at redhat.com
>> https://www.redhat.com/mailman/listinfo/crash-utility
>>
>
>
>
> --
> Kurtis Rader
> Caretaker of the exceptional canines Junior and Hank
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/crash-utility/attachments/20140219/69683953/attachment.htm>
More information about the Crash-utility
mailing list