В двоичном коде PIE раздел кода изменяется во время выполнения.Почему это происходит? - PullRequest
0 голосов
/ 04 октября 2018

Из-за природы двоичного файла PIE все данные в двоичном формате не могут быть доступны по адресу абсолютный .
Таким образом, существует два способа доступа к данным относительно

TWO Way

  1. Во время выполнения загрузчик загружает местоположение данных в GOT запись.
    И двоичный доступ к этому адресу.

  2. Рассчитать адрес данных, используя _GLOBAL_OFFSET_TABLE местоположение и доступ к нему.



Но я нашел относительно другой способ доступа к данным.
В двоичном коде ниже двоичный код изменил <.text> код секции.
Это было очень странно.

.global main
main:
 push stderr


Я скомпилировалэто в двоичном виде.

jiwon@jiwon$ gcc -fPIE -pie -o test test.s
jiwon@jiwon$ objdump -D test_pie | grep "<main>" -A5
000005c0 <main>:
 5c0:   ff 35 00 00 00 00       pushl  0x0
 5c6:   66 90                   xchg   %ax,%ax
 5c8:   66 90                   xchg   %ax,%ax
 5ca:   66 90                   xchg   %ax,%ax


Как вы можете видеть выше разборка, push stderr собран в pushl 0x0.
И .. Когда я исполняю двоичный файл,

pwndbg> disass /r main
Dump of assembler code for function main:
=> 0x004005c0 <+0>: ff 35 48 18 40 00   push   DWORD PTR ds:0x401848
   0x004005c6 <+6>: 66 90   xchg   ax,ax
   0x004005c8 <+8>: 66 90   xchg   ax,ax
   0x004005ca <+10>:    66 90   xchg   ax,ax

Раздел <.text> изменился, чтобы указать stderr!
Я думаю, что это очень странно, потому что <.text> имеет разрешение -WX для общего применения.
Но В этом случае <.text> это RWX разрешение.


Вопрос:

  1. Почему это происходит?Почему компилятор решил использовать этот странный способ вместо TWO Way ?
  2. Это обычная ситуация в pie binary ..?

1 Ответ

0 голосов
/ 05 октября 2018

Позиционно-независимый исполняемый файл создается совместной работой компилятора и компоновщика, а не только компоновщиком.В вашем случае вы передали GCC уже собранный код, вероятно, не тот, который компилятор создал бы с флагом PIE.

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

...