在揭秘Execve Shellcode中,解释了编写execve shellcode的方法:
#include<stdio.h>
#include<string.h>
unsigned char code[] =
"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";
main()
{
printf("Shellcode Length: %d\n", strlen(code));
int (*ret)() = (int(*)())code;
ret();
}
int (*ret)() = (int(*)())code;
这行代码是做什么的?
nop(0x90)
会导致EXC_BAD_ACCESS
,因为内核不会运行来自.bss、.text或堆的任何代码,因为这些区域引用了带有第63位设置(NX)的PAE/长模式页表条目。在没有像PAX/ExecShield这样的东西的非PAE/非长模式操作系统上可能会起作用,比如DOS。写入代码区域也不起作用(通过一堆C内联asmnop
进行自变异)。最好制作一个程序,为给定的平台生成最小的可执行文件并运行它。 - user246672