Как определить, является ли p _vaddr в заголовке программы ELF реальным адресом памяти или просто смещением от базового адреса разделяемой библиотеки?

Это выглядит странно отчасти из-за того, что tacработает несколько противоречащим -интуитивным образом, как мне кажется. Воспользуемся хорошо заметными разделителями — запятыми.

Что я ожидаю увидеть в результате выполнения следующей команды:

% echo -ne 'A,B,C' | tac -s,

?

Ну, я вижу это, поскольку есть А, отделенное от В, отделенное от С. Таким образом, (я заключаю, что )напечатаны в обратном порядке, они должны составлять C,B,A. Давайте проверим. Увы, вместо этого он печатает по-другому:

% echo -ne 'A,B,C' | tac -s,
CB,A,

Мы можем сделать вывод, что tacпалочки для первоначального размещения разделителей:Aвсе еще имеют его впоследствии, как и B, но Cего не было, и поэтому он напечатан как есть.

Что произойдет, если на этот раз я запущу tacс -b?

% echo -ne 'A,B,C' | tac -bs,
,C,BA

По-видимому, это работает следующим образом:-b:он проходит через вход в обратном направлении, пока не найдет разделитель. Как выяснилось, напечатано:

,. Затем он печатает текст, который был пропущен при поиске :

.

C. Затем цикл повторяется:

,B. Поскольку разделителей не осталось, печатается только остаток:

A.

Why there is no newline between New and Hello?

Согласно объяснению, которое я дал выше, Newбудет на новой строке, потому что перед ним стоит новая строка -,но так как Helloне было — он будет напечатан как есть.

1
16.09.2021, 05:50
1 ответ

Кажется, я разобрался, вам нужно проверить все сегменты PT _LOAD и найти тот, у которого самый низкий p _vaddr (Я назову его самым низким _pt _] загрузить ).

Затем, чтобы вычислить ячейку памяти,:libc_base + segment.p_addr - lowest_pt_load.p_vaddr

В случае с Centos 6 самая низкая загрузка _pt _была равна базовому адресу libc, что привело к их отмене.

Источник:https://docs.oracle.com/cd/E19683-01/816-1386/6m7qcoblk/index.html#chapter6-83432

Base Address

Executable and shared object files have a base address, which is the lowest virtual address associated with the memory image of the program's object file. One use of the base address is to relocate the memory image of the program during dynamic linking.

An executable or shared object file's base address is calculated during execution from three values: the memory load address, the maximum page size, and the lowest virtual address of a program's loadable segment. The virtual addresses in the program headers might not represent the actual virtual addresses of the program's memory image. See "Program Loading (Processor-Specific)".

To compute the base address, you determine the memory address associated with the lowest p_vaddr value for a PT_LOAD segment. You then obtain the base address by truncating the memory address to the nearest multiple of the maximum page size. Depending on the kind of file being loaded into memory, the memory address might not match the p_vaddr values.

1
16.09.2021, 06:23

Теги

Похожие вопросы