Я пытаюсь найти строку кода в дампе xxd. Если я открою исполняемый файл с помощью gdb и добавлю точку останова в строке кода, он покажет адрес, такой как 0x8212224, но мой дамп xxd поднимается только до 0x3040080.
Есть ли способ перевести адрес GDB в то, что находится в дампе? Или есть лучший способ получить адрес в дампе xxd?
Я пытаюсь найти строку кода в дампе 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
выход.