Как получить адрес .plt, когда у меня есть GOT_OFFSET_TABLE? - PullRequest
0 голосов
/ 26 февраля 2020

Когда я тестировал, чтобы восстановить исполняемый файл elf из образа процесса, я получил .dynami c и GOT_OFFSET_TABLE, но глобальная таблица смещений была заполнена разрешенными значениями соответствующих функций общей библиотеки. Я должен заменить эти адреса с исходными адресами заглушки PLT. Итак, как я могу получить адреса-заглушки PLT из образа процесса.

for(c=0;dyn[c].d_tag !=DT_NULL ;c++){
        switch (dyn[c].d_tag){
            case DT_PLTGOT:
                got = (Elf64_Addr)dyn[c].d_un.d_ptr;
                printf("[+]Located plt.got vaddr:0x%x\n",got);
                printf("[+]Relevant GOT entries begin at 0x%x\n", (Elf64_Addr)dyn[c].d_un.d_ptr + 24);

                got_off = dyn[c].d_un.d_ptr - h.data_vaddr;

                GOT_TABLE = (Elf64_Addr*)&pmem[h.data_offset +got_off];
                GOT_TABLE += 3;
                break;
         ...
}
Elf64_Addr PLT_VADDR = ?

gdb-peda$ x/10gx  0x601000 + 3*8
0x601018:   0x00007f3eaf557800  0x00007f3eaf522740    0x601018->GOT_OFFSET_TABLE[3]
0x601028:   0x00007f3eaf578160  0x0000000000000000
0x601038:   0x0000000000000000  0x0000000000000000
0x601048:   0x0000000000000000  0x0000000000000000
0x601058:   0x0000000000000000  0x0000000000000000

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Итак, мне удалось получить доступ к адресу .plt в разобранном двоичном файле, скомпилированном с P IE (независимое от процесса выполнение). Я заметил, что раздел .plt всегда был над разделом .text.

Вычитая размер таблицы перемещений, хранящейся в DT_RELSZ, до точки входа e_entry, вы можете получить адрес .plt. Я пока не знаю, совпадение ли это и что этот трюк на самом деле мусор, но он работает.

Я проверил множественные значения elfparser, и кажется, что все они используют имя раздела (sh_name) для идентификации раздела .plt. Нас просят восстановить файл ELF в памяти, и кажется, что заголовки разделов имеют отношение только к ссылкам и не загружены для выполнения, но я не уверен, и вы должны дважды это проверить.

0 голосов
/ 05 марта 2020

Похоже, мы читаем одну и ту же книгу «Обучение Linux Бинарный анализ» и придерживаемся того же упражнения. Я не нашел элегантного способа получения адреса .plt, но вы можете найти его, используя ElfN_Shdr.sh_name и указав strcmp(ElfN_Shdr.sh_name, '.plt').

Автор, elfmaster, похоже, использует это:

https://github.com/elfmaster/ftrace/blob/master/ftrace.c#L418

...