Звоните 0x80482f0"? Просто нужно уточнить одну строку кода в программе" hello world "в сборке x86 - PullRequest
3 голосов
/ 02 октября 2011

"call 0x80482f0 <puts@plt>"?Просто нужна помощь с одной строкой кода в программе «hello world» в сборке x86.

ПРИМЕЧАНИЕ: я запускаю ubuntu linux во время программирования / отладки, используя gcc в качестве компилятора и gdb для отладчика.

Я читаю Взлом: Искусство Эксплуатации V2 , и я собрал эту программу на C:

1       #include <stdio.h>
2
3       int main()
4       {
5         int i;
6         for(i=0; i<10; i++)
7         {
8           printf("Hello, world\n");
9         }
10        return 0;

в эту программу на ассемблере:

   0x080483b4 <+0>:     push   ebp
   0x080483b5 <+1>:     mov    ebp,esp
   0x080483b7 <+3>:     and    esp,0xfffffff0
   0x080483ba <+6>:     sub    esp,0x20
   0x080483bd <+9>:     mov    DWORD PTR [esp+0x1c],0x0
   0x080483c5 <+17>:    jmp    0x80483d8 <main+36>
   0x080483c7 <+19>:    mov    DWORD PTR [esp],0x80484b0
   0x080483ce <+26>:    call   0x80482f0 <puts@plt>
=> 0x080483d3 <+31>:    add    DWORD PTR [esp+0x1c],0x1
   0x080483d8 <+36>:    cmp    DWORD PTR [esp+0x1c],0x9
   0x080483dd <+41>:    jle    0x80483c7 <main+19>
   0x080483df <+43>:    mov    eax,0x0
   0x080483e4 <+48>:    leave  
   0x080483e5 <+49>:    ret

сейчас .. я понимаю каждую часть этой программы, пока она не доберется до:

   0x080483ce <+26>:    call   0x80482f0 <puts@plt>

то, что я не понимаю, это ... если "Hello, world \ n" хранится в 0x80484b0, иэтот адрес затем сохраняется в адресе в ESP, почему:

0x080483ce <+26>:    call   0x80482f0 <puts@plt>

ссылается на 0x80482f0 вместо [esp] или просто «0x80484b0», чтобы вывести «Hello, world \ n» на экран?я использовал gdb, и я не могу понять, на что именно ссылается 0x80482f0 .. любая помощь будет отличной

спасибо (и помните, я только начинаю с этого материала, так что я новичок)

также .. я скопировал и вставил разобранную основную функцию из gdb для удобства, если вам нужна дополнительная информация, просто спросите.и если вы хотели бы объяснить эту одну команду для меня, это было бы также хорошо, потому что я использовал только "int 80h" для вывода материала на экран до

1 Ответ

15 голосов
/ 02 октября 2011

0x80482f0 - это адрес функции puts. Точнее, он указывает на запись для puts() в таблице программных компоновщиков (PLT) - в основном это просто набор JMP <some routine in a so-library> с ( немного сложнее чем это, но это не важно для этого обсуждения). Функция puts ищет свой аргумент в стеке, т. Е. В [esp].

Вам может быть интересно, откуда поступил этот вызов puts() - компилятор здесь был достаточно умен, чтобы понять, что вы на самом деле не использовали никаких строковых параметров форматирования при вызове printf(), и заменили этот вызов на вызов к (несколько быстрее) puts(). Если вы посмотрите внимательно, то увидите, что он также удалил новую строку из вашей строки, потому что puts() добавляет новую строку после печати указанной строки.

...