【问题标题】:injecting shellcode注入shellcode
【发布时间】:2013-01-18 14:58:40
【问题描述】:

我在网络服务器上有一个带有变量 user="..." 的 .cmd 文件,容易受到缓冲区溢出的影响。我可以通过 ssh 或 web 执行 .cmd 文件。 现在我有了这个 shellcode:

#include <stdio.h>

char sc[] =
         "
          ...
             ";

void main(void)
{

       void(*s)(void);
       printf("size: %d\n", sizeof(sc));
       s = sc;
       s();
}

我的问题是,我不知道这一切是如何结合在一起的。我知道汇编器和 C 代码的作用,但是如何将代码注入到正在运行的 cmd 文件中?

【问题讨论】:

    标签: shellcode


    【解决方案1】:
    cat "shellcode "  | nc host cmd
    

    【讨论】:

      【解决方案2】:

      您通常必须插入足够多的数据,这样您的写入才能在程序内存的一部分中被执行。如何做到这一点完全取决于溢出程序的结构。

      但是,想象一下如果程序是由这个 ASM 列表指定的:

      [SECTION .text]
      
      global _start
      
      _start:
      ;;...
      jmpagain: 
      jmp next
      
      uname db "username"
      next:
      mov eax,uname
      ;;...
      jmp jmpagain
      

      字符串"username" 在内存中紧邻指令指针访问的地址。如果程序在没有检查边界的情况下将一些数据写入该内存区域,它将覆盖代码,并且只要指令指针重新访问next 函数,机器就会执行该内存部分中溢出的任何数据。假设您正在利用的写入从字符串的开头开始,并在某些为您注入 shellcode 提供足够空间的条件下停止写入,您将在输入。那么你的 shellcode 的开头将是next 标签的地址。

      但这只是基本原理的简单示例演示。实际上,将数据放入指令指针访问的内存区域可能会更加棘手。如果您有权访问有问题的命令文件,则可以对其进行调试并转储内存并跟踪内存区域的写入方式,以查看您需要如何溢出缓冲区才能到达 IP 可访问内存。

      重要的是要重申,您的 shellcode 不仅需要将其放入指令指针传递的内存中,还需要在该内存中正确对齐才能以您期望的方式执行。如果指令指针位于代码中间的某个位置而不是第一条指令的开头,那么它显然不会按照您的预期进行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        • 1970-01-01
        • 2014-10-21
        相关资源
        最近更新 更多