Либо что-то не так с вашим ассемблером или дизассемблером, либо существует простое несоответствие в нотации.
Например, две общие нотации для x86 (Intel и AT & T) меняют порядок операндов, например:
mov ebx, 0 ; Intel
mov $0, %ebx ; AT&T
Оба эти значения означают одно и то же, устанавливая регистр ebx
на ноль.
В Справочнике по кодировщику, на который вы ссылаетесь, используемые инструменты используют две разные записи,Например, на одной странице (стр. 39 в моем издании) вы видите этот текст:
Давайте напишем эти три шага в сборке.Затем мы можем получить двоичный файл ELF;из этого файла мы наконец можем извлечь коды операций.
Section .text
global _start
_start:
mov ebx,0
mov eax,1
int 0x80
Теперь мы хотим использовать ассемблер nasm
для создания нашего объектного файла, а затем использовать компоновщик GNU для связывания объектафайлы:
[slap@0day root] nasm -f elf exit_shellcode.asm
[slap@0day root] ld -o exit_shellcode exit_shellcode.o
Наконец, мы готовы получить наши коды операций.В этом примере мы будем использовать objdump
.Утилита objdump
- это простой инструмент, который отображает содержимое объектных файлов в удобочитаемой форме.Он также хорошо печатает код операции при отображении содержимого объектного файла, что делает его полезным при разработке шелл-кода.Запустите нашу программу через objdump
, например:
[slap@0day root] objdump -d exit_shellcode
exit_shellcode:file format elf32-i386
Disassembly of section .text:
08048080 <.text>:
8048080: bb 00 00 00 00 mov $0x0,%ebx
8048085: b8 01 00 00 00 mov $0x1,%eax
804808a: cd 80 int $0x80
Из этого вы можете совершенно ясно увидеть, что nasm
ожидает запись Intel , но objdump
производит AT & T запись.Надо просто привыкнуть к различиям между ними.