【问题标题】:Shellcode not runningShellcode 没有运行
【发布时间】:2016-01-16 01:40:33
【问题描述】:

我尝试通过 C 程序运行很多 shell 代码来测试它们。在这里

#include<stdio.h>
#include<string.h>
unsigned char code[] = "shell here";
main()
{
printf("Shellcode Length: %d\n", strlen(code));
int (*ret)() = (int(*)())code;
ret();
}

这里是shellcode的例子

"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb"\
          "\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89"\
          "\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd"\
          "\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f"\
          "\x73\x68\x58\x41\x41\x41\x41\x42\x42\x42\x42"

(\bin\cat \etc\shadow) 运行后

gcc sctest.c -o out ./out

它只是给了我 shellcode 长度和分段错误 我已经尝试了很多不同的 shellcode 但一切都给了我段错误 我的dmesg |尾-1 [18440.783383] 测试[8768]:8049700 ip 08049700 sp bffff2ec 测试中的错误 15 [8049000+1000] 的段错误 我的 shellcode 有什么问题?

【问题讨论】:

  • 现在应该是一个常见问题解答。在现代系统上,仅执行数据将不再起作用,请参见例如NX 位.
  • @FelixPalmen 谢谢!我花了很多时间试图理解缓冲区溢出,现在看来我已经准备好利用测试程序了
  • 如今要利用缓冲区溢出,您将需要更复杂的技术,例如 ROP(面向返回的编程)
  • 致反对者:我认为你不应该因为类似的事情不时出现,恕我直言,这将是一个很好的地方来澄清为什么 simple 开发只是跳到你的堆栈上的自己的代码将不再起作用。也许有人觉得有必要写一个的答案......
  • @FelixPalmen 我已经读过 ROP 但我想从头开始

标签: c segmentation-fault shellcode


【解决方案1】:

在禁用 NX-bit 和其他类似 randomize_va_space 的东西后,我终于做到了。

首先你应该使用 -z execstack 和 -fno-stack-protector 键编译你的可执行文件。

之后禁用 ASLR echo 0 > /proc/sys/kernel/randomize_va_space。 现在你必须找到shellcode。您可以尝试 mspayload 或 msfvenom。 Shellcode 是一个字节码,通常会为您提供 shell。

在该步骤中,您应该找到堆栈溢出的偏移量。您可以尝试查找类似

的行
sub hex-offset, %esp

或者您可以尝试使用简单的脚本(例如 ./your_binary

找到偏移后(SEGFAULT 发生并且 dmesg | tail -1 说 %eip 是 0x41414141)你只需要编写你的漏洞利用。它的结构是这样的

NOPs(no operation)*x+shellcode+return-address(4 bytes)*y

len(shellcode)+x+4y=你的偏移量 其中返回地址是堆栈中 NOP 所在位置的地址(输入前在 gdb info r 中看到的 %esp 地址)

并且不要忘记,如果没有 gdb,在 gdb 中工作的漏洞利用将无法工作,因为您需要从返回地址中添加/减去 36 个字节。

终于可以利用了

./your_binary < exploit.bin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    相关资源
    最近更新 更多