Shellcode测试出错
Shellcode testing gone wrong
嘿,我正在使用你们大多数人都熟悉的一些代码。它基本上接受一个字符数组并将其转换为函数指针。使用这段代码,理论上你可以用它测试任何 shellcode 的功能,如果它表现良好,这对我的工作来说将是一个非常有价值的程序......我在 Windows XP 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 作为 "shellcode" 因为它对眼睛和大脑都很容易,而且无论如何都可能有效。不幸的是它没有。
当我编译 运行 程序时,我得到...
An unhandled win32 exception occurred in horsefile.exe[3612].
...当我在 gdb 中 运行 它时,我得到...
Program received signal SIGSEV, Segmentation fault.
0x00409000 in code()
...其中0x00409000是shellcode函数ret()的入口点地址。
我已经关闭了 DEP,因为我想转换字符数组,我认为它在堆栈上(实际上可能在 .data 部分),并且堆栈上没有执行代码(转换将字符数组数据视为堆栈上的代码)。所以我关闭了 DEP,但它仍然运行不正常。
有什么想法吗?请记住,我在 Windows XP SP3 上使用 Windows 的 MinGW compiler/debugger 套件。
编辑 - unsigned char code[]
而不是 char *code[]
... 仍然不起作用...
编辑 - 在 "shellcode" 的末尾添加了 ret (\xc3)
,仍然没有快乐...
您的 shell 代码 包含 nops、一个 0x00
操作码并且没有更多已知内容。我可以看到失败的 2 个原因:
- 操作系统可能不允许您 运行 来自存储字符串文字的段的代码。
- 操作序列不会以
RET
操作码结束,因此您最终会 运行ning 一些随机的未知操作码...
尝试将 code
更改为 unsigned char const code[] = "\x90\x90\x90\x90\x90\x90\x90\x90\xC3";
或者,您可以尝试在 main()
函数中本地定义 code
:
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
数组的位置可能无法执行。
我明白了。毕竟我的 Windows XP SP3 VM 的 DEP(数据执行保护)实际上已经打开了。
要在 Windows XP 上关闭它,请按照 these 步骤操作。
对于 Windows Vista - Windows10 下载并安装 Enhanced Mitigation Experience Toolkit、运行 它,并指定您想要的安全设置。
嘿,我正在使用你们大多数人都熟悉的一些代码。它基本上接受一个字符数组并将其转换为函数指针。使用这段代码,理论上你可以用它测试任何 shellcode 的功能,如果它表现良好,这对我的工作来说将是一个非常有价值的程序......我在 Windows XP 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 作为 "shellcode" 因为它对眼睛和大脑都很容易,而且无论如何都可能有效。不幸的是它没有。
当我编译 运行 程序时,我得到...
An unhandled win32 exception occurred in horsefile.exe[3612].
...当我在 gdb 中 运行 它时,我得到...
Program received signal SIGSEV, Segmentation fault.
0x00409000 in code()
...其中0x00409000是shellcode函数ret()的入口点地址。
我已经关闭了 DEP,因为我想转换字符数组,我认为它在堆栈上(实际上可能在 .data 部分),并且堆栈上没有执行代码(转换将字符数组数据视为堆栈上的代码)。所以我关闭了 DEP,但它仍然运行不正常。
有什么想法吗?请记住,我在 Windows XP SP3 上使用 Windows 的 MinGW compiler/debugger 套件。
编辑 - unsigned char code[]
而不是 char *code[]
... 仍然不起作用...
编辑 - 在 "shellcode" 的末尾添加了 ret (\xc3)
,仍然没有快乐...
您的 shell 代码 包含 nops、一个 0x00
操作码并且没有更多已知内容。我可以看到失败的 2 个原因:
- 操作系统可能不允许您 运行 来自存储字符串文字的段的代码。
- 操作序列不会以
RET
操作码结束,因此您最终会 运行ning 一些随机的未知操作码...
尝试将 code
更改为 unsigned char const code[] = "\x90\x90\x90\x90\x90\x90\x90\x90\xC3";
或者,您可以尝试在 main()
函数中本地定义 code
:
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
数组的位置可能无法执行。
我明白了。毕竟我的 Windows XP SP3 VM 的 DEP(数据执行保护)实际上已经打开了。
要在 Windows XP 上关闭它,请按照 these 步骤操作。
对于 Windows Vista - Windows10 下载并安装 Enhanced Mitigation Experience Toolkit、运行 它,并指定您想要的安全设置。