Как получить objdump без байтов NUL? - PullRequest
3 голосов
/ 10 марта 2019

У меня есть этот код в сборке:

global _start
section .rodata
  hello: db "Hello World!", 10

section .text

_start:
    mov eax,4           
    mov ebx,1          
    mov ecx,hello       
    mov edx,13     
    int 80h             

    ; Terminate program
    mov eax,1          
    xor ebx,ebx           
    int 80h

Если я возьму objdump следующего кода, я получу:

enter image description here

Если я получу NUL-символы в objdump, я не смогу выполнить задачу, над которой я работаю. Как получить objdump без байтов NUL (0x00)?

1 Ответ

5 голосов
/ 10 марта 2019

Чтобы исключить байты 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 .

...