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

How to get an objdump without NUL bytes?

我在汇编中有这段代码:

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,我得到:

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

为了消除 OBJDUMP 中的 NUL(0x00) 字节,您需要将 assembles 的 shellcode 写入不包含 NUL 字节的指令中。您使用的方法也取决于目标。您正在编写 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

您可以 assemble 和 link 此代码到名为 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    [=12=]x4,%al
 8048067:       31 db                   xor    %ebx,%ebx
 8048069:       43                      inc    %ebx
 804806a:       31 d2                   xor    %edx,%edx
 804806c:       b2 0d                   mov    [=12=]xd,%dl
 804806e:       cd 80                   int    [=12=]x80
 8048070:       31 c0                   xor    %eax,%eax
 8048072:       40                      inc    %eax
 8048073:       31 db                   xor    %ebx,%ebx
 8048075:       cd 80                   int    [=12=]x80

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

如果您正在寻找 64 位漏洞利用的等效代码,您可以在 Whosebug answer.

中找到这样的示例