Из-за природы двоичного файла PIE все данные в двоичном формате не могут быть доступны по адресу абсолютный .
Таким образом, существует два способа доступа к данным относительно
TWO Way
Во время выполнения загрузчик загружает местоположение данных в GOT
запись.
И двоичный доступ к этому адресу.
Рассчитать адрес данных, используя _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
разрешение.
Вопрос:
- Почему это происходит?Почему компилятор решил использовать этот странный способ вместо TWO Way ?
- Это обычная ситуация в pie binary ..?