所以最近我一直在学习低级编程语言(例如汇编,从我的理解只是符号二进制)并且遇到了Shellcoding(例如“\ x4D ......”等)。我发现你可以将Shellcode输入到C / C ++应用程序然后执行它 - 我的问题是,是否可以从现有的exe应用程序生成Shellcode,然后在C / C ++应用程序中使用这个生成的Shellcode?我误解了Shellcoding的可能性吗?非常感谢 - 一个对低级编程知识非常有限的人
答案 0 :(得分:0)
是否可以从现有的exe应用程序生成Shellcode,然后在C / C ++应用程序中使用此生成的Shellcode
答案:不是.Shellcode是基于独立的,可执行的PE文件有大量的标题等,你不能在执行某些操作之前执行它/
Shellcode - 这是一个非常大的问题。
首先,您需要知道外部库(如kernel32,user32 libs等)的函数地址存储在导入地址表中,该表由启动时的Windows-loader填充。所有内存工作都是通过地址进行的,即在编译阶段进行计算。所以你需要自己找到地址。
要从shellcode调用函数,您必须拥有自己的函数地址加载器。这个加载器必须加载kernel32.dll库,搜索GetProcAddress函数并填写IAT
你不知道你的shellcode将加载什么地址,你可以从这样的代码中知道它,调用“delta-offset”
call delta
delta:
pop ebp
sub ebp,offset delta
现在在ebp中偏移到实际的地址,所以要获得函数地址的变量,你需要加上偏移量,例如:
lea eax, [variable]
add eax, ebp; adding a delta-offset
mov ecx, dword ptr DS:[eax]
要编译代码以备将来使用,您应该使用类似FASM的东西,编译后使用WinHex编辑器 - >复制 - >全部复制 - > GREP C来源
你会得到类似“\ x00 \ x28”之类的内容,要调用它你需要为shellcode数组设置执行权限,并通过命令处理程序如jmp / call / etc更改EIP
在Windows系统Hello,World MessageBox
中有一个示例# include <stdlib.h>
# include <stdio.h>
# include <string.h>
# include <windows.h>
int
main(void)
{
char *shellcode = "\x33\xc9\x64\x8b\x49\x30\x8b\x49\x0c\x8b"
"\x49\x1c\x8b\x59\x08\x8b\x41\x20\x8b\x09"
"\x80\x78\x0c\x33\x75\xf2\x8b\xeb\x03\x6d"
"\x3c\x8b\x6d\x78\x03\xeb\x8b\x45\x20\x03"
"\xc3\x33\xd2\x8b\x34\x90\x03\xf3\x42\x81"
"\x3e\x47\x65\x74\x50\x75\xf2\x81\x7e\x04"
"\x72\x6f\x63\x41\x75\xe9\x8b\x75\x24\x03"
"\xf3\x66\x8b\x14\x56\x8b\x75\x1c\x03\xf3"
"\x8b\x74\x96\xfc\x03\xf3\x33\xff\x57\x68"
"\x61\x72\x79\x41\x68\x4c\x69\x62\x72\x68"
"\x4c\x6f\x61\x64\x54\x53\xff\xd6\x33\xc9"
"\x57\x66\xb9\x33\x32\x51\x68\x75\x73\x65"
"\x72\x54\xff\xd0\x57\x68\x6f\x78\x41\x01"
"\xfe\x4c\x24\x03\x68\x61\x67\x65\x42\x68"
"\x4d\x65\x73\x73\x54\x50\xff\xd6\x57\x68"
"\x72\x6c\x64\x21\x68\x6f\x20\x57\x6f\x68"
"\x48\x65\x6c\x6c\x8b\xcc\x57\x57\x51\x57"
"\xff\xd0\x57\x68\x65\x73\x73\x01\xfe\x4c"
"\x24\x03\x68\x50\x72\x6f\x63\x68\x45\x78"
"\x69\x74\x54\x53\xff\xd6\x57\xff\xd0";
DWORD why_must_this_variable;
BOOL ret = VirtualProtect (shellcode, strlen(shellcode),
PAGE_EXECUTE_READWRITE, &why_must_this_variable);
if (!ret) {
printf ("VirtualProtect\n");
return EXIT_FAILURE;
}
printf("strlen(shellcode)=%d\n", strlen(shellcode));
((void (*)(void))shellcode)();
return EXIT_SUCCESS;
}
您可能正在寻找RunPE算法。该算法可以在另一个内部执行PE可执行您正在打开另一个进程,复制节,填充IAT表并从新入口点恢复目标进程。这是一个代码注入tecnhiques,使用我的恶意软件。所以我不会解释如何实现它
答案 1 :(得分:-1)
Shellcode是用作漏洞利用的有效负载的机器代码(例如buffer overflow)。根据其使用的利用,它可能具有诸如最大长度或不允许的某些字节值(例如零)之类的限制。对于shellcode来说,没有一个通用的答案。
一般来说,但是:是的,原则上可以在shellcode中嵌入一个完整的程序。它可以采用小包装器(可能是手工编写的程序集)的形式,将程序写入新的.exe
文件然后运行它,或者它可以使用更复杂的技术来替换内存中的当前程序。可能有自动化工具来创建这种shellcode,虽然我不知道具体是什么。
然而,你问题的基调让我觉得你可能误解了一些重要的事情:
我发现你可以将Shellcode输入到C / C ++应用程序然后执行它
这是一个错误,而不是一个功能。能够将新代码注入正在运行的程序中,程序并不是特意允许的,这是一个主要的安全漏洞。在过去的几十年里,这类事情已成为许多安全漏洞的根源,开发人员花了很多精力试图阻止它发生。
如果可以将shellcode注入程序,程序就会被破坏。