如何获取没有NUL字节的objdump?

时间:2019-03-10 13:52:39

标签: assembly x86 nasm shellcode objdump

我在汇编中有以下代码:

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

如果在objdump中获得NUL字符,我将无法完成我正在处理的任务。我如何在没有任何NUL(0x00)字节的情况下获取objdump?

1 个答案:

答案 0 :(得分:5)

为了消除OBJDUMP中的NUL(0x00)个字节,您需要编写汇编成不包含NUL字节的指令的Shellcode。您使用的方法也取决于目标。您是在编写32位漏洞还是64位漏洞?您当前的问题似乎是32位漏洞利用,因此我会做一个假设。

32位代码中更复杂的情况是获取字符串的地址(当作为无NUL字节的漏洞利用程序运行时,它将基于堆栈)。您可以使用JMP/CALL/POP method来实现。或者,您也可以直接在堆栈上构建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

您可以使用以下命令将代码汇编并链接到名为hello1的32位可执行文件中:

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!

您现在可以使用以下命令将其转换为shellcode字符串:

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 \ xcd \ x80 \ xe8 \ xe6 \ xff \ xff \ xff \ x48 \ x65 \ x6c \ x6c \ x6f \ x20 \ x57 \ x6f \ x72 \ x6c \ x64 \ x21 \ x0a

如果您正在寻找用于64位漏洞利用的等效代码,则可以在此Stackoverflow answer中找到这样的示例。