注入shellcode

时间:2013-01-18 14:58:41

标签: shellcode

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

2 个答案:

答案 0 :(得分:0)

cat "shellcode "  | nc host cmd

答案 1 :(得分:0)

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

但是,想象一下该程序是否由此ASM列表指定:

[SECTION .text]

global _start

_start:
;;...
jmpagain: 
jmp next

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

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

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

重要的是要重申,你的shellcode不仅需要将它转移到指令指针经过的内存中,还需要在该内存中正确对齐,以便按照你期望的方式执行。如果指令指针落在代码中间的某个位置而不是第一条指令的开头,那么它显然不会按照你的预期去做。