Различия между выводом кода сборки одной и той же программы - PullRequest
3 голосов
/ 16 июня 2010

Я пытался скопировать пример переполнения буфера3 из этой статьи aleph one

Я делаю это в качестве практики для проекта в курсе компьютерной безопасности, который я берупоэтому, пожалуйста, мне очень нужна ваша помощь.Я следовал примеру, выполняя задачи по ходу дела.Моя проблема в том, что ассемблерный код, выгруженный gdb на моем компьютере (я делаю это на образе Debian Linux, работающем на VM Ware), отличается от того, что приведен в примере в статье.Есть некоторые конструкции, которые я нахожу запутывающими.

Вот тот, что с моего компьютера: alt text http://img692.imageshack.us/img692/7619/dump1.png

Вот тот, что из статьи ...

Dump of assembler code for function main:
0x8000490 <main>:       pushl  %ebp
0x8000491 <main+1>:     movl   %esp,%ebp
0x8000493 <main+3>:     subl   $0x4,%esp
0x8000496 <main+6>:     movl   $0x0,0xfffffffc(%ebp)
0x800049d <main+13>:    pushl  $0x3
0x800049f <main+15>:    pushl  $0x2
0x80004a1 <main+17>:    pushl  $0x1
0x80004a3 <main+19>:    call   0x8000470 <function>
0x80004a8 <main+24>:    addl   $0xc,%esp
0x80004ab <main+27>:    movl   $0x1,0xfffffffc(%ebp)
0x80004b2 <main+34>:    movl   0xfffffffc(%ebp),%eax
0x80004b5 <main+37>:    pushl  %eax
0x80004b6 <main+38>:    pushl  $0x80004f8
0x80004bb <main+43>:    call   0x8000378 <printf>
0x80004c0 <main+48>:    addl   $0x8,%esp
0x80004c3 <main+51>:    movl   %ebp,%esp
0x80004c5 <main+53>:    popl   %ebp
0x80004c6 <main+54>:    ret
0x80004c7 <main+55>:    nop

Как видите, тамразличия между двумя.Я в замешательстве и не могу полностью понять код сборки с моего компьютера.Я хотел бы знать различия между ними.

Чем pushl отличается от push, mov vs movl и т. Д. ...

что означает выражение 0xhexavalue(%register)?

Я естьизвините, если я много спрашиваю, но мне очень нужна ваша помощь.

ОБНОВЛЕНИЕ:

Почему параметр функции 'function' был переведен в другой код сборки:

Из статьи я полагаю, что параметры 1, 2 и 3 для функции были перенесены в стек.

В одном из моего компьютера параметры были перемещены в регистр'esp' с некоторым смещением.

Они разные?Спасибо

Спасибо за помощь действительно ...

Ответы [ 3 ]

4 голосов
/ 16 июня 2010

Мне кажется, ваш компилятор и / или система отличаются от тех, которые использовались в статье. Конечно, ваш код был сгенерирован по-другому.

push против pushl просто выдвигают (потенциально) разные объемы данных - вам нужно будет просмотреть документацию на ассемблере, чтобы узнать, какие инструкции они отображают в чипе. Глядя на код операции машины может помочь там. Руководство Intel поможет вам понять это. То же самое касается mov и movl. Вполне возможно, что они одинаковы, и ваш дизассемблер просто отключает l, когда он не нужен для ясности.

Выражение 0xhexvalue(%register) обращается к памяти по смещению hexvalue от значения в register. Представьте это как код C *(register + hexvalue).

4 голосов
/ 16 июня 2010

Реальной разницы нет. «movl» означает «двигаться долго», то есть перемещать 32-битное значение. Код в статье использует эту явную форму каждый раз. Код, который вы дизассемблировали, пропускает 'l', если он может быть выведен из операндов (например, когда вы перемещаете значение в EAX, оно должно быть 32-битным, поскольку EAX является 32-битным регистром вы нажимаете ECX, вы должны нажимать 32-битное значение, потому что ECX также является 32-битным регистром).

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

0 голосов
/ 16 июня 2010

Статья Aleph One вышла в 96 году, если я правильно помню. Таким образом, после 14 лет разработки GCC по-разному создает исполняемые файлы, поэтому эффективный код будет другим. Попробуйте выполнить компиляцию со всеми отключенными оптимизациями (gcc -O0) и с кодом отладки в (gcc -g), возможно, код будет немного чище / проще.

...