我创建了一个汇编程序来执行shell:
section .text
global _start
_start:
xor eax, eax
push eax
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
push eax
push ebx
mov ecx, esp
mov al, 0xb
int 0x80
因为我正在使用64位机器,所以我使用
编译并链接了程序 nasm -f elf shellcode.asm
ld -m elf_i386 shellcode.o -o shellcode
使用objdump生成shellcode。编译和链接的程序非常好。但问题是shellcode在这个C程序中不起作用:
// shellcode.c
#include <stdio.h>
char shellcode[] =
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
int main()
{
fprintf(stdout ,"Length: %d\n", strlen(shellcode));
(*(void(*)()) shellcode)();
return 0;
}
我知道在上面的shellcode数组中编写的shellcode可能是错误的,但事实并非如此。即使使用正确的shellcode,问题仍然存在。这是一个冲突问题,因为建筑?我不这么认为,因为该程序是为32位机器编译并成功链接的,我知道64位机器向后兼容32位机器。我尝试使用-fno-stack-protector -z execstack
参数编译C程序并禁用ASLR但没有发生任何事情。