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

问题描述 投票:3回答:1

我在汇编中有这个代码:

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?

assembly x86 nasm shellcode objdump
1个回答
5
投票

为了消除OBJDUMP中的NUL(0x00)字节,您需要编写汇编成不包含NUL字节的指令的shellcode。您使用的方法也取决于目标。您在编写32位漏洞利用程序还是64位漏洞利用程序?您当前的问题似乎是32位漏洞,所以我将做出这样的假设。

32位代码中更复杂的情况是获取字符串的地址(在没有NUL字节的情况下作为漏洞运行时将基于堆栈)。您可以使用JMP/CALL/POP method来实现这一目标。或者,您也可以直接在堆栈上构建Hello World!字符串。我将提出一个使用JMP / CALL / POP的版本,如文章中所述:

你好1.Assam:

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)

您应该注意,此代码没有NULL字节。如果您将./hello1作为独立程序运行,则应输出:

你好,世界!

您现在可以将其转换为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位漏洞的等效代码,您可以在此Stackoverflow answer中找到这样的示例。

© www.soinside.com 2019 - 2024. All rights reserved.