我今天开始组装以创建shell代码.ASM很好,过了一段时间我创建了这个:
[SECTION .text]
global _start
_start:
call ender
starter:
mov al, 4
mov bl, 1
pop ecx
mov dl, 21
int 0x80
xor eax, eax
mov al, 1
xor ebx,ebx
int 0x80
ender:
call starter
db 10,'Shellcode forever!',10 ,10
哪个效果很好:
Shellcode forever!
root@root:~/Desktop# clear;nasm -f elf test.asm;ld -s -o test test.o;./test
所以我接着使用了'objdump -d test'并得到了这个:
test: file format elf32-i386
Disassembly of section .text:
08048060 <.text>:
8048060: e8 11 00 00 00 call 0x8048076
8048065: b0 04 mov $0x4,%al
8048067: b3 01 mov $0x1,%bl
8048069: 59 pop %ecx
804806a: b2 15 mov $0x15,%dl
804806c: cd 80 int $0x80
804806e: 31 c0 xor %eax,%eax
8048070: b0 01 mov $0x1,%al
8048072: 31 db xor %ebx,%ebx
8048074: cd 80 int $0x80
8048076: e8 ea ff ff ff call 0x8048065
804807b: 0a 53 68 or 0x68(%ebx),%dl
804807e: 65 gs
804807f: 6c insb (%dx),%es:(%edi)
8048080: 6c insb (%dx),%es:(%edi)
8048081: 63 6f 64 arpl %bp,0x64(%edi)
8048084: 65 20 66 6f and %ah,%gs:0x6f(%esi)
8048088: 72 65 jb 0x80480ef
804808a: 76 65 jbe 0x80480f1
804808c: 72 21 jb 0x80480af
804808e: 0a 0a or (%edx),%cl
但是当我把它变成shellcode时:
char code[] = "\xe8\x11\x00\x00\x00\xb0\x04\xb3\x01\x59\xb2\x15\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xea\xff\xff\xff\x0a\x53\x68\x65\x6c\x6c\x63\x6f\x64\x65\x20\x66\x6f\x72\x65\x76\x65\x72\x21\x0a\x0a";
它没有用。我做错了什么?
答案 0 :(得分:1)
这是问题所在:
nasm -f elf test.asm
ELF是一种二进制格式,可用于生成可执行文件,这也是您的独立测试工作的原因,但是shellcode以原始格式提供,而不是包含标题,节等内容。
要获得所述原始字节,您只需将elf
替换为bin
:
nasm -f bin test.asm
这将使用您指定的助记符生成原始对象。为了让自己的生活更轻松,我通常包括:
[bits 32]
或
[bits 64]
汇编程序文件中的以获得正确的体系结构。
更改为直接二进制输出将中断链接可执行测试,因为链接器链接了与ELF兼容的对象,而不是原始的二进制文件块。没有解决方法 - 但没有理由你不能生成这个编译版本和二进制版本。
在Linux系统上,我通常不会直接打扰链接,而是使用如下所示的小型测试平台:
#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#define PAGE_SIZE 4096U
uint8_t buffer[] = {
0xeb, 0x01, 0x90, ...
};
typedef int (* func)();
int main(int argc, char** argv)
{
func f;
mprotect((void*)((size_t)&buffer[0] & ~(PAGE_SIZE -1)),
2*PAGE_SIZE, PROT_READ | PROT_EXEC);
f = (func) &buffer[0];
f();
return 0;
}
我有时会针对不同的情况进行修改,例如我介绍相关的复制环境。要开始使用它,请使用以下命令编译:
gcc -z execstack -fno-stack-protector -std=gnu99 -o testshell testshell.c
这会运行execstack
来启用二进制文件中的可执行堆栈,这不是一个真实的目标环境,但是这个 是一个测试,并关闭堆栈保护器,这也是出现在目标上,但却阻碍了基础发展。