+ Reply to Thread
Results 1 to 2 of 2

Thread: ELF format.ARM. .plt section

  1. #1

    Default ELF format.ARM. .plt section

    Доброго времени суток.

    Никак не могу понять, как мне получить исходят из смещения, которое находится в .plt имя функции. Т.е., например, иммею след. код:
    Code:
    .text:0005D42C                 MOV     R0, #0xBD0      ; cap
    .text:0005D430                 BL      someFunc ;0x4fa54
    .text:0005D434                 LDR     R3, [R11,#var_20]
    someFunc - это функция из сторонней либы динамечески прилинкованной.

    Что я делал, перешл по этому смещению, что указан в команде BL. Это смещение оказалось из секции .plt и я так понял на прямую я не могу вытянуть имя функции, значит должен быть какой-то другой подход.

    Пошел смотреть секцию .rel.plt, нашел там свою функцию:
    Code:
    00153d7c  0002b616 R_ARM_JUMP_SLOT   00000000   someFunc
    Смещение 00153d7c - находится уже в секции .got, посмотрел, что находися по этому смещению. Получил 0004f680 - это смещение начала секции .plt. По этому смещению находится код:
    Code:
    .plt:0004F680                 STR     LR, [SP,#-4]!
    .plt:0004F684                 LDR     LR, =_GLOBAL_OFFSET_TABLE_ ; PIC mode
    .plt:0004F688                 NOP
    .plt:0004F68C                 LDR     PC, [LR,#8]!
    И я так понял вот отсюда мы получаем интересующий меня адрес 0x4fa54, только я не пойму как... Ведь получается, что в РС всегда один и тот же адрес... И когда я вызываю какую-то другую функцию из динамически прилинкованой библиотеки, так адрес вроде как не поменяется...

    Вообще вопрос, собсвтенном. в том как из смещения (0x4fa54), которое н аходится в .plt получить, что за имя функции. А то что-то я вообще запутался в этом формате Elf, хотя бы б картинке где-то нормальные сделали бы, что ли....

  2. #2

    Default Re: ELF format.ARM. .plt section

    Я немножко разобрался как все происходит...

    Получается, что когда я получаю смещение функции в .plt секции и перехожу по нему, то там высчитывается смещение, которое указаывается в .got секции и уже с этого смещения, я могу вытащить имя функции, но вот, что меня волнует. После того как я перехожу по смещению, что указан в .plt секции, я получаю для каждой функции, что динамически линкуется, подобный код:
    Code:
    .plt:0004FA54 ; void someFunc(int g)
    .plt:0004FA54 someFunc                               ; CODE XREF: GLB::Application::Init(void)+1Cp
    .plt:0004FA54                                         ; GLB::Application::InitCurrentTest(void)+9Cp ...
    .plt:0004FA54                 ADR     R12, 0x14FA5C
    .plt:0004FA58                 ADD     R12, R12, #0x4000
    .plt:0004FA5C                 LDR     PC, [R12,#(someFunc - 0x153A5C)]!
    .plt:0004FA5C ; End of function someFunc
    Собственно, результатом выполнения этого кода будет нужный мне смещение по которому я могу получить имя функции, НО теперь вопрос, что бы мне его получить, то придется диассембить эти 3 команды каждый раз. Правильно ли так делать? или я не туда лезу?

    P.S.: а как получается вообще прототип функции?
    Last edited by coldfire; 10-06-2013 at 13:00.

+ Reply to Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:33
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org