我在汇编中有以下代码:
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?
答案 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中找到这样的示例。