如何获得没有 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.
中找到这样的示例
我在汇编中有这段代码:
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.
中找到这样的示例