Пример разборки "Art of Exploitation" не совпадает (код C) - PullRequest
8 голосов
/ 08 августа 2011

Я следую примеру, приведенному в книге «Искусство эксплуатации», чтобы попытаться разобрать программу на C, в то время как книга поставляется с собственным Linux LiveCD, я предпочитаю использовать BT5 (32 бит).

TheПример кода очень прост - (я использовал его так же)

#include <stdio.h>

int main()
{
  int i;
  for(i=0; i < 10; i++)       // Loop 10 times.
  {
    puts("Hello, world!\n");  // put the string to the output.
  }
  return 0;                   // Tell OS the program exited without errors.
}

Автор использует

gcc file_name.c

для компиляции кода, и я использую почти тот же синтаксис, но с -o, чтобы сохранить скомпилированный путь туда, куда я хочу.

Затем он использует команду -

objdump -D цикл |grep -A20 main.:

для проверки скомпилированного двоичного файла.

Это его вывод -

reader@hacking:~/booksrc $ objdump -D a.out | grep -A20 main.:
08048374 <main>:
 8048374:       55                      push   %ebp
 8048375:       89 e5                   mov    %esp,%ebp
 8048377:       83 ec 08                sub    $0x8,%esp
 804837a:       83 e4 f0                and    $0xfffffff0,%esp
 804837d:       b8 00 00 00 00          mov    $0x0,%eax
 8048382:       29 c4                   sub    %eax,%esp
 8048384:       c7 45 fc 00 00 00 00    movl   $0x0,0xfffffffc(%ebp)
 804838b:       83 7d fc 09             cmpl   $0x9,0xfffffffc(%ebp)
 804838f:       7e 02                   jle    8048393 <main+0x1f>
 8048391:       eb 13                   jmp    80483a6 <main+0x32>
 8048393:       c7 04 24 84 84 04 08    movl   $0x8048484,(%esp)
 804839a:       e8 01 ff ff ff          call   80482a0 <printf@plt>
 804839f:       8d 45 fc                lea    0xfffffffc(%ebp),%eax
 80483a2:       ff 00                   incl   (%eax)
 80483a4:       eb e5                   jmp    804838b <main+0x17>
 80483a6:       c9                      leave
 80483a7:       c3                      ret
 80483a8:       90                      nop
 80483a9:       90                      nop
 80483aa:       90                      nop
reader@hacking:~/booksrc $

, и это мой вывод для той же программы-

root @ bt: ~ # objdump -D loop |grep -A20 main.:

080483e4 <main>:
 80483e4:   55                      push   %ebp
 80483e5:   89 e5                   mov    %esp,%ebp
 80483e7:   83 e4 f0                and    $0xfffffff0,%esp
 80483ea:   83 ec 20                sub    $0x20,%esp
 80483ed:   c7 44 24 1c 00 00 00    movl   $0x0,0x1c(%esp)
 80483f4:   00 
 80483f5:   eb 11                   jmp    8048408 <main+0x24>
 80483f7:   c7 04 24 e0 84 04 08    movl   $0x80484e0,(%esp)
 80483fe:   e8 15 ff ff ff          call   8048318 <puts@plt>
 8048403:   83 44 24 1c 01          addl   $0x1,0x1c(%esp)
 8048408:   83 7c 24 1c 09          cmpl   $0x9,0x1c(%esp)
 804840d:   7e e8                   jle    80483f7 <main+0x13>
 804840f:   b8 00 00 00 00          mov    $0x0,%eax
 8048414:   c9                      leave  
 8048415:   c3                      ret    
 8048416:   90                      nop
 8048417:   90                      nop
 8048418:   90                      nop
 8048419:   90                      nop
 804841a:   90                      nop
root@bt:~# 

Как вы думаете, есть разница, потому что я не использую тот же дистрибутив Linux?Также похоже, что его код вызывает функцию printf(), а мой вызывает функцию puts() (как он использовал в своем примере).

Ответы [ 3 ]

6 голосов
/ 08 августа 2011

Это не должно быть разницей в ОС, достаточно, если вы используете другую версию GCC для создания другого машинного кода / кода сборки.

Относительно puts / printf - компилятор использует все, что решит лучше (с точки зрения эффективности, безопасности и т. Д.), Когда вы вызываете printf без формата, в этом нет необходимости, поэтому он использует puts что быстрее.

1 голос
/ 08 августа 2011

Даже если вы используете один и тот же компилятор (gcc), не ожидается, что компиляция на разных машинах в один и тот же день или на одной и той же машине в разные дни даст один и тот же результат.

Разные версии gcc,32-разрядный или 64-разрядный и т. Д. Если вы не установили gcc самостоятельно, чтобы точно соответствовать gcc, установленному автором, то, скорее всего, у вас другая версия, и ожидается, что код будет другим.

После добавления оптимизацийи другие параметры командной строки (связанные с генерацией кода, -o не является одним из них) различия на одном и том же компьютере в один и тот же день сильно различаются.

Я надеюсь, что это не главное для книги, яможно было бы ожидать, что он научит вас этим различиям, но как воспользоваться некоторыми вещами, когда вы увидите, что они созданы.По сути, придерживайтесь того, что придумала книга, поскольку это, вероятно, связано с тем, чему книга пытается научить.

Суть в том, что один и тот же код никогда не будет построен, некоторые компиляторы заходят так далеко, чтоотметка времени в файле, гарантирующая, что никакие две сборки никогда не будут точно совпадать.В частности, gcc постоянно развивается, и два человека не создают его одинаково, поэтому даже при одинаковой исходной версии вы можете увидеть различия в выводе.

0 голосов
/ 08 августа 2011

Возможно, другая версия компилятора.Ваш оптимизирует вызов на printf - поскольку в действительности нет строки форматирования, вызов puts может быть немного быстрее.

...