Адреса в GDB против xxd дампа

Я пытаюсь найти строку кода в дампе xxd. Если я открою исполняемый файл с помощью gdb и добавлю точку останова в строке кода, он покажет адрес, такой как 0x8212224, но мой дамп xxd поднимается только до 0x3040080.

Есть ли способ перевести адрес GDB в то, что находится в дампе? Или есть лучший способ получить адрес в дампе xxd?

0

Решение

Я пытаюсь найти строку кода в дампе xxd.

Зачем? Чего вы действительно пытаетесь достичь?

Скорее всего, вы можете достичь этого гораздо проще с GDB.

Если я открою исполняемый файл с помощью gdb и добавлю точку останова в строке кода, он покажет адрес, такой как 0x8212224, но мой дамп xxd поднимается только до 0x3040080.

Вам нужно понять много больше о вашем исполняемом файле, чем это.

Запустите эту команду: readelf -l your_exe, Это покажет вам, что есть несколько LOAD сегменты в вашем исполняемом файле и сообщат вам, с какого смещения эти сегменты начинаются в файле, по какому виртуальному адресу эти сегменты должны появляться в памяти, насколько они велики и какую защиту они должны иметь.

Например:

$ readelf -l a.out

Elf file type is EXEC (Executable file)
Entry point 0x80482f0
There are 9 program headers, starting at offset 52

Program Headers:
Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
PHDR           0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4
INTERP         0x000154 0x08048154 0x08048154 0x00013 0x00013 R   0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD           0x000000 0x08048000 0x08048000 0x0056c 0x0056c R E 0x1000
LOAD           0x000f08 0x08049f08 0x08049f08 0x00114 0x00118 RW  0x1000
DYNAMIC        0x000f14 0x08049f14 0x08049f14 0x000e8 0x000e8 RW  0x4
NOTE           0x000168 0x08048168 0x08048168 0x00044 0x00044 R   0x4
GNU_EH_FRAME   0x000490 0x08048490 0x08048490 0x0002c 0x0002c R   0x4
GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
GNU_RELRO      0x000f08 0x08049f08 0x08049f08 0x000f8 0x000f8 R   0x1

Это говорит о том, что исполняемый текст программы (первый LOAD сегмент) появляется в памяти по адресу 0x08048000и в файле по смещению 0, То есть инструкция, которую xxd будет показывать со смещением 0x124 в файл появится по адресу 0x08048124 в памяти.

Предполагая, что ваш исполняемый файл также связан с загрузкой по адресу по умолчанию 0x08048000Инструкция по 0x8212224 в памяти появится смещение 0x1ca224 в xxd выход.

2

Другие решения


По вопросам рекламы [email protected]