Упаковщики исполняемых файлов в LINUX-BSD


         

но вот стартовый код вызывает


1: x/i $pc  0x80482dc <_start+28>
: call   0x80482b0 <_init+56>

; но вот стартовый код вызывает библиотечную функцию ___libc_start_main,

; поскольку компилятор еще не знает ее фактического адреса,

; он вставляет переходник к секции .plt, содержащей переходники

; к секции .got, заполняемой динамическим загрузчиком

#.plt:080482B0       ___libc_start_main   proc near

#.plt:080482B0 FF 25 D0 95 04 08  jmp    ds:off_80495D0

1: x/i $pc  0x80482b0 <_init+56>
: jmp    *0x80495d0

; IDA Pro

корректно отобразила plt-переходник, вызывающий функцию,

; указатель на которую расположен в двойном слове по адресу 80495D0h

#.got:080495D0 E8 95 04 08 off_80495D0   dd offset __libc_start_main

1: x/i $pc  0x80482b6 <_init+62>
: push   $0x8

1: x/i $pc  0x80482bb <_init+67>
: jmp    0x8048290 <_init+24>

; а вот тут уже начались расхождения...

; IDA Pro

уверяет, что здесь расположено смещение функции __libc_start_main

; в то время как отладчик показывает, что здесь находится специальный код

; push 08h/jmp

8048290h. посмотрим, что покажет IDA Pro по адресу 8048290h

# .plt:08048290 ?? ?? ?? ?? ?? ?? dd 4 dup(?)

1: x/i $pc  0x8048290 <_init+24>
: pushl  0x80495c4

1: x/i $pc  0x8048296 <_init+30>
: jmp    *0x80495c8

; парад различий продолжается!!! IDA Pro

вообще не показывает ничего!!!

; отладчик же показывает код, засылающий в стек смещение первого (считая от нуля)

; элемента таблицы .got и передающего управление по адресу, записанного во втором

; элементе таблицы .got. как следует из спецификации elf-формата, первые три элемента

; секции .got зарезервированы для служебных целей и вторая из них хранит адрес функции

; _dl_map_object_deps, которая, получив в качестве аргумента адрес начала .got'а

; читает его содержимое (а содержатся там ссылки на библиотечные функции)

; и заполняет extern фактическими адресами

0x4000bbd0 in _dl_map_object_deps () from /lib/ld-linux.so.2

1: x/i $pc  0x4000bbd0 <_dl_map_object_deps+4384>
:     push %eax

; ага! вот эта функция, расположенная на моей машине по адресу 4000BBD0h,

; принадлежащему библиотеке libc.so.6 (на других машинах этот адрес может быть иным)

; она-то и выполняет всю работу по инициализации extern'а, в котором находится

; наш расшифровщик, уже расшифровавший программу, а затем вызывает __libc_start_main,

; так что загрузка динамической библиотеки происходит совершенно прозрачно


Содержание  Назад  Вперед