我有以下代码应该删除shell,但是,在我运行代码后似乎没有任何事情发生。这是我的代码。这是从shellcoder的手册中获得的。
`
char shellcode[] =
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
int main()
{
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}`
我使用gcc -fno-stack-protector -z execstack shellcode.c -o shellcode
以下是产生上述结果的代码:
int main()
{
char *name[2];
name[0] = "/bin/sh";
name[1] = 0x0;
execve(name[0], name, 0x0);
exit(0);
}
我不确定为什么会这样。我在Windows 10上使用Ubuntu。这可能不会影响我的结果,但我已禁用ASLR。这可能是一个问题。我还没有在VM上试过这个。在我这样做之前,我想尝试找出为什么这不起作用。如果不清楚,请告诉我,我很乐意澄清任何细节。
我提前感谢您的所有帮助。
- UPDATE -
我能够从我提供的shellcode中获取汇编指令。
有没有人看到任何会导致shell不被删除的问题?
答案 0 :(得分:1)
在同事的帮助下,我们弄清楚了为什么shellcode没有执行。 shellcode很好,问题实际上是对gcc编译器的更新,它改变了代码执行时如何处理prolog / epilog。当程序启动时,编译器生成的代码将返回地址放在堆栈上,但它使用新模式执行此操作。执行程序不再直接使用返回地址,方法是将其弹出到指令指针(IP)中。相反,它将堆栈值弹出到%ecx
,然后使用地址%ecx-4
(对于32位计算机)的内容作为返回地址。因此,即使关闭了保护措施,我尝试这样做的方式也永远无法发挥作用。此行为仅影响main()
,而不影响main调用的函数。因此,一个简单的解决方案是将main的内容放入另一个函数foo()
并从main()调用foo(),如下所示。
char shellcode[] =
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
void foo()
{
int *ret;
ret = (int *)&ret + 4;
(*ret) = (int)shellcode;
}
int main()
{
foo();
}
这是一个与此答案相关的问题。 Understanding new gcc prologue
答案 1 :(得分:0)
这里有几件事可能出错:
.data
段中。 (但这会导致进程以信号终止)。