0

我在网络服务器上有一个带有变量 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 文件中?

4

2 回答 2

0
cat "shellcode "  | nc host cmd
于 2013-07-09T17:25:04.110 回答
0

您通常必须插入足够的数据,以便您的写入最终进入程序执行的部分内存。如何做到这一点完全取决于溢出程序的结构。

但是,想象一下如果这个 ASM 清单指定了程序:

[SECTION .text]

global _start

_start:
;;...
jmpagain: 
jmp next

uname db "username"
next:
mov eax,uname
;;...
jmp jmpagain

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

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

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

于 2017-04-29T18:23:39.713 回答