【问题标题】:How to get an objdump without NUL bytes?如何获得没有 NUL 字节的 objdump?
【发布时间】:2019-03-10 13:52:38
【问题描述】:

我在汇编中有这段代码:

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?

【问题讨论】:

  • 您组装的文件(并且在问题的顶部)不是您转储的文件。
  • 我会假设这真的是关于 shellcode 漏洞利用的全部?
  • 您正在查看不相关的文件。它甚至不是 64 位汇编/32 位反汇编不匹配,在您的源代码中你有 syscall 而在反汇编中你有 int 80 - 它们是完全不相关的文件。
  • 我建议在我写的这个 Stackoverflow 答案中查看 shellcode:stackoverflow.com/a/50690339/3857942。它是 64 位代码,将字符串打印到控制台,然后退出并避免 NUL 字节,这几乎正是您在这里尝试做的。
  • objdump 只是一个反汇编程序。 它只显示文件中的字节。 编写汇编为机器代码的 asm 不包含任何 00 字节,然后 objdump 输出将不含它们。最明显的一点是,对于小常量,您必须避免使用mov r32, imm32,因为不幸的是没有r/m32, imm8 形式的mov。 push imm8 / pop reg 是一种常见的解决方法,或者使用已知库中的lea

标签: assembly x86 nasm shellcode objdump


【解决方案1】:

为了消除 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 作为独立程序运行,它应该会输出:

世界你好!

您现在可以使用以下命令将其转换为 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 中找到这样的示例。

【讨论】:

  • 您好,感谢您抽出宝贵时间回答这个问题。但是生成的shellcode有个小问题。它有 \xeb\x15\x59\x31\xc0\xb0\x04 并且是复制停止 (\x04)。有没有相同的解决方法?。
  • 一种可能的解决方案(尚未测试)是,例如,将mov $0x4,%al 替换为mov $69,%al ; sub $65,%al。这将创建 EA 字符。
  • 另外,inc eax 没有将 eax 值设置为 1。我连接 gdb 并检查,它在增量后显示 eax=-4。由于 inc 命令未按预期工作,因此导致程序未终止。
  • @srccode 您做错了超出此实际问题范围的事情。您现在的问题似乎围绕着将代码作为漏洞利用运行。我建议使用您的 shellcode 从这个问题开始一个全新的问题,您尝试利用的程序的代码以及您用于组装/链接/构建的所有命令并运行,以便有人可以尝试识别/重现您的问题
  • inc al 正确递增 al 的值 bu inc eax 或 inc ebx 不起作用。
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 2017-04-25
  • 2011-02-13
  • 2013-03-04
  • 2011-09-05
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
相关资源
最近更新 更多