首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shellcode测试出错

Shellcode测试出错
EN

Stack Overflow用户
提问于 2016-08-10 16:22:32
回答 2查看 277关注 0票数 0

嘿,我在用你们大多数人都熟悉的一些代码。它基本上接受一个字符数组,并将其转换为一个函数指针。有了这段代码,理论上你可以用它来测试任何外壳代码的功能,如果它能运行的话,对我的工作来说是一个非常有价值的程序。我在Windows SP3上做这件事,并且使用MinGW的gcc编译,使用gdb来调试该死的东西。

这是我得到的..。

代码语言:javascript
复制
unsigned char code[] =
"\x90\x90\x90\x90\x90\x90\x90\x90";
main()
{
  printf("Code length = %i...\n",sizeof(code)-1);
  int (*ret)()=(int(*)())code;
  ret();
}

所以我决定使用nops作为“外壳代码”,因为它对眼睛和大脑都很容易,而且无论如何都可能起作用。不幸的是,事实并非如此。

当我编译并运行程序时,我得到.

代码语言:javascript
复制
An unhandled win32 exception occurred in horsefile.exe[3612].

...and当我在gdb运行它的时候.

代码语言:javascript
复制
Program received signal SIGSEV, Segmentation fault.
0x00409000 in code()

...where 0x00409000是外壳代码函数ret()的入口点地址。

我关闭了DEP,因为我认为转换字符数组是在堆栈上(实际上可能在.data部分),并且堆栈上没有执行代码(转换将字符数组数据作为堆栈上的代码处理)。所以我关掉了DEP,它还在做错事。

有什么想法吗?记住,我使用的是Windows上的MinGW编译器/调试器套件SP3。

编辑- unsigned char code[]而不是char *code[] .还是不管用..。编辑-添加的ret (\xc3)末尾的“外壳代码”,仍然没有joy.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-12 08:03:56

我想通了。毕竟,我的Windows SP3 VM的DEP (数据执行预防)实际上是开着的。

要在Windows上关闭它,请执行这些步骤。

对于Windows Windows 10下载并安装增强缓解经验工具包,运行它,并指定所需的安全设置。

票数 0
EN

Stack Overflow用户

发布于 2016-08-10 16:46:11

您的shell代码包含nops、0x00操作码和其他已知内容。我可以看到两个失败的原因:

  • 操作系统可能不允许您从存储字符串文本的段运行代码。
  • 操作序列不会以RET操作码结束,因此您将运行一些随机的未知操作码.

尝试将code更改为unsigned char const code[] = "\x90\x90\x90\x90\x90\x90\x90\x90\xC3";

或者,您可以尝试在本地在code函数中定义main()

代码语言:javascript
复制
int main(void) {
    unsigned char code[] = "\x90\x90\x90\x90\x90\x90\x90\xC3";

    printf("Code at %p, length = %i\n", (void*)code, (int)sizeof(code)-1);
    int (*ret)() = (int(*)())code;
    ret();
}

这两种方法都不能工作,因为编译器存储code数组的位置可能是不可执行的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38878823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档