Чтобы исключить байты NUL (0x00) в OBJDUMP, вам нужно написать шелл-код, который собирается в инструкции, не содержащие байтов NUL. Методы, которые вы используете, также зависят от цели. Вы пишете 32-битный или 64-битный? Ваш текущий вопрос выглядит как 32-битный эксплойт, поэтому я сделаю это предположение.
Более сложной ситуацией в 32-битном коде является получение адреса строки (который будет основан на стеке при запуске в качестве эксплойта без байтов NUL). Для этого можно использовать метод JMP / CALL / POP . Кроме того, вы также можете напрямую создать строку Hello World!
в стеке. Я предложу версию с использованием JMP / CALL / POP, как описано в статье:
hello1.asm
global _start
section .text
_start:
jmp call
pop:
pop ecx ; ECX = address of hello
xor eax, eax ; EAX = 0
mov al, 4 ; EAX = 4 (int 0x80 sys_write)
xor ebx, ebx
inc ebx ; EBX = 1 (1 = Standard output)
xor edx, edx
mov dl, hellolen ; EDX = length of hello string
int 0x80
; Terminate program
xor eax, eax
inc eax ; EAX = 1 (int 0x80 sys_exit)
xor ebx, ebx ; EBX = return value of 0
int 0x80
call:
call pop
hello: db "Hello World!", 10
hellolen equ $-hello
Вы можете собрать и связать этот код с 32-битным исполняемым файлом с именем hello1
, используя:
nasm -f elf32 hello1.asm -o hello1.o
ld -melf_i386 hello1.o -o hello1
Результат objdump -D hello1
:
hello1: file format elf32-i386
Disassembly of section .text:
08048060 <_start>:
8048060: eb 15 jmp 8048077 <call>
08048062 <pop>:
8048062: 59 pop %ecx
8048063: 31 c0 xor %eax,%eax
8048065: b0 04 mov $0x4,%al
8048067: 31 db xor %ebx,%ebx
8048069: 43 inc %ebx
804806a: 31 d2 xor %edx,%edx
804806c: b2 0d mov $0xd,%dl
804806e: cd 80 int $0x80
8048070: 31 c0 xor %eax,%eax
8048072: 40 inc %eax
8048073: 31 db xor %ebx,%ebx
8048075: cd 80 int $0x80
08048077 <call>:
8048077: e8 e6 ff ff ff call 8048062 <pop>
0804807c <hello>:
804807c: 48 dec %eax
804807d: 65 6c gs insb (%dx),%es:(%edi)
804807f: 6c insb (%dx),%es:(%edi)
8048080: 6f outsl %ds:(%esi),(%dx)
8048081: 20 57 6f and %dl,0x6f(%edi)
8048084: 72 6c jb 80480f2 <hello+0x76>
8048086: 64 21 0a and %ecx,%fs:(%edx)
Обратите внимание, что в этом коде нет байтов NUL. Если вы запускаете ./hello1
как отдельную программу, она должна вывести:
Hello World!
Теперь вы можете преобразовать это в строку шелл-кода с помощью:
objcopy -Obinary hello1 shellcode.bin
hexdump -v -e '"\\""x" 1/1 "%02x" ""' shellcode.bin
Команда OBJCOPY преобразует исполняемый файл в необработанный двоичный файл, а вторая выводит строку, которую можно использовать в целях эксплойта. Выход должен быть:
\ xeb \ x15 \ x59 \ x31 \ xc0 \ XB0 \ x04 \ x31 \ XDB \ x43 \ x31 \ XD2 \ XB2 \ x0D \ XCD \ x80 \ x31 \ xc0 \ x40 \ x31 \ XDB \ XCD \ x80 \ X Е8 \ XE6 \ XFF \ XFF \ XFF \ x48 \ x65 \ x6c \ x6c \ x6f \ x20 \ x57 \ x6f \ x72 \ x6c \ x64 \ x21 \ x0a
Если вы ищете эквивалентный код для 64-битных эксплойтов, вы можете найти такой пример в этом ответе Stackoverflow .