嘿,我在用你们大多数人都熟悉的一些代码。它基本上接受一个字符数组,并将其转换为一个函数指针。有了这段代码,理论上你可以用它来测试任何外壳代码的功能,如果它能运行的话,对我的工作来说是一个非常有价值的程序。我在Windows SP3上做这件事,并且使用MinGW的gcc编译,使用gdb来调试该死的东西。
这是我得到的..。
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作为“外壳代码”,因为它对眼睛和大脑都很容易,而且无论如何都可能起作用。不幸的是,事实并非如此。
当我编译并运行程序时,我得到.
An unhandled win32 exception occurred in horsefile.exe[3612]....and当我在gdb运行它的时候.
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.
发布于 2016-08-12 08:03:56
发布于 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():
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数组的位置可能是不可执行的。
https://stackoverflow.com/questions/38878823
复制相似问题