LINUX.ORG.RU

[C++] ELF - Количество записей в программном заголовке


0

1

Занимаюсь анализом Elf-файлов. Возник вопрос по таблице программного заголовка. По смещению 0x1C в ELF-заголовке указано смещение где начинается эта таблица. Далее по смещению 0x2A указан размер одной записи в этой таблице(обычно 32 байта), а по смещению 0x2C количество этих записей в таблице. Первые 4 байта каждой из записей таблицы указывают на тип секции. Судя по документации они могу принимать такие значения:

    file.seek(phOffset + 0x00);
    file.read((char*)&programHeader.p_type, sizeof(int));
    switch(programHeader.p_type)
    {
    case 0: return "Record ignored";
        break;
    case 1: return "Loadable Segment";
        break;
    case 2: return "Dynamic Section";
        break;
    case 3: return "Program Interpreter";
        break;
    case 4: return "Notes";
        break;
    case 5: return "Element of this type do not conform to the ABI";
        break;
    case 6: return "Specifies the location and size of the program header table itself (in file and in memory image of program)";
        break;
    case 0x60000000: return "Values in this inclusive range are reserved for OS-specific semantics.";
        break;
    case 0x6fffffff: return "Values in this inclusive range are reserved for OS-specific semantics.";
        break;
    case 0x70000000: return "Values in this inclusive range are reserved for processor-specific semantics.";
        break;
    case 0x7fffffff: return "Values in this inclusive range are reserved for processor-specific semantics.";
        break;
    default: return "Unknown";
    }

В одном из файлов, судя по числу по смещению 0x2C, 9 записей в таблице программного заголовка. Но смотря все 9 записей тип секций определяется только у первых 6 секций. Шестая имеет тип notes. У остальных трех записей в начале стоит число, которых нет в документации. А именно 50E5, 51E5, 52E5. То есть в свитче срабатывает default. Что это? Я неправильно определяю количество записей в таблице программного заголовка или эти числа тоже имеют свое значение?

Вообще есть проверенные анализаторы, чтобы я мог сверить с ними и проверить адекватность данных, выдаваемых моей программой?


Возьми readelf и посмотри что он думает на этот счёт.

anonymous ()

Во-первых, рекомендую не использовать сами смещения и «магические константы» в программе. Гораздо удобнее применять структуры. Благо, elf файлы описаны в стандартном заголовочном файле elf.h. Ну а стандартные программы для анализа elf файлов — это readelf(скорее всего то, что Вам нужно) и objdump.

uighur ()

Спасибо. Про readelf я не знал.

Судя по нему последние 3 записи в программном заголовке имеют значение: GNU_EH_FRAME, GNU_STACK, GNU_RELRO

Есть где-то документация по этим значениям? Хотя бы расшифровка. В спецификации на ELF такого просто нет.

Digan ()

Был немного невнимательным. В спецификации значения 0x60000000 и 0x6fffffff это не отдельные значения, а диапазон значение которых зависит от конкретной ОС.

Теперь такой вопрос.

│0x6474e550 │ gnu eh frame │0x6474e551 │ gnu stack │0x6474e552 │ gnu relro |0x65041580 │ pax flags

Это значения для Linux? И да. Их расшифровки я до сих по не знаю..

Digan ()
Ответ на: комментарий от Digan

EH_FRAME - это, видимо, exception handlers frame

RELRO - readonly relocations

unC0Rr ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.