我在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文件中?
答案 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不仅需要将它转移到指令指针经过的内存中,还需要在该内存中正确对齐,以便按照你期望的方式执行。如果指令指针落在代码中间的某个位置而不是第一条指令的开头,那么它显然不会按照你的预期去做。