Понимание этого дампа, созданного objdump - PullRequest
0 голосов
/ 19 июня 2019

Я очень плохо знаком с языком ассемблера. Я изучаю это уже 2 недели. Вот дамп, сгенерированный objdump. objdump -Mintel -d stack

00000560 <function>:
    560:    55                      push   ebp
    561:    89 e5                   mov    ebp,esp
    563:    83 ec 10                sub    esp,0x10
    566:    e8 26 00 00 00          call   591 <__x86.get_pc_thunk.ax>
    56b:    05 95 1a 00 00          add    eax,0x1a95
    570:    90                      nop
    571:    c9                      leave
    572:    c3                      ret

00000573 <main>:
    573:    55                      push   ebp
    574:    89 e5                   mov    ebp,esp
    576:    e8 16 00 00 00          call   591 <__x86.get_pc_thunk.ax>
    57b:    05 85 1a 00 00          add    eax,0x1a85
    580:    6a 03                   push   0x3
    582:    6a 02                   push   0x2
    584:    6a 01                   push   0x1
    586:    e8 d5 ff ff ff          call   560 <function>
    58b:    83 c4 0c                add    esp,0xc
    58e:    90                      nop
    58f:    c9                      leave
    590:    c3                      ret

Я сейчас учусь в стеке. Я не уверен, что пролог применим только к функциям. Я не вижу sub в третьей строке основной функции. Не уверен, что пролог всегда использует этот шаблон.

Я также запутался в <__x86.get_pc_thunk.ax> Не уверен, что это такое.

Мне также интересно, почему он добавляет 0x1a95 к eax, и я не уверен, почему он выбрал это число. В основном значение, которое было добавлено к eax, было 0x1a85.

Вот c, который я скомпилировал с gcc. Я использовал gcc -m32 -ggdb stack.c -o stack

void function(int a, int b, int c) {
  char buffer1[5];
  char buffer2[10];
}

void main() {
  function(1, 2,3 );
}

Теперь я пытаюсь найти buffer1 и buffer2 в разобранном коде. Buffer1 [5], я думаю, будет 0x05, а buffer2 [10] будет 0x0a. Я не могу найти его в разобранном коде.

1 Ответ

2 голосов
/ 20 июня 2019

Массивы buffer1 и buffer2 размещаются в стеке с использованием инструкции

sub esp, 0x10

То, что это делает, вычитает 0x10 или 16 из текущего значения указателя стека, то есть esp, который увеличивает пространство стека в вашей функции на 16 байт (char - это один байт, и есть 5 из них в buffer1 и 10 из них в buffer2, и результат округляется до 16 байтов по причинам выравнивания, AFAIK). В main() такой инструкции нет, потому что она не имеет локальных переменных и, следовательно, не требует стекового пространства.

(Это более подробно объясняется в главе 4 этой книги: http://pacman128.github.io/pcasm/)

...