c - 在 C 中将长 shellcode 加载到内存中
问题描述
我希望我的 shellcode 在 x86 架构中运行,但是 C 中的 char 数组的限制约为 16k,而我的 shellcode 更长。我打破了 2 个数组上的字符串并开始如下:
char n1qwgimnb8i[] = "\x75\x6d\xf2\x34...";
char n1qwgimnb8i1[] = "\x74\xdf\x39\x37...";
void *zx1rwsnvf4l = VirtualAlloc(0, sizeof n1qwgimnb8i + sizeof n1qwgimnb8i1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(zx1rwsnvf4l, n1qwgimnb8i, sizeof n1qwgimnb8i);
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i, n1qwgimnb8i1, sizeof n1qwgimnb8i1);
CreateThread(NULL, 0, zx1rwsnvf4l, NULL, 0, NULL);
我用 cl 编译并且没有错误,但是当我启动最终的 .exe 时它崩溃了。我做错了什么?
解决方案
数组的字符串样式初始化,char
如
char hoge[] = "foo";
在数据末尾自动添加终止空字符,此示例等效于
char hoge[] = {'f', 'o', 'o', '\0'};
因此,会在两个数组之间插入一个额外的0x00
字节,这可能会造成麻烦。
线
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i, n1qwgimnb8i1, sizeof n1qwgimnb8i1);
应该
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i - 1, n1qwgimnb8i1, sizeof n1qwgimnb8i1);
(- 1
应添加以使副本从原始数据之后开始而不终止空字符)
推荐阅读
- r - 从位置矩阵为稀疏矩阵创建向量 p
- javascript - 删除@ids 和文本包含来自电报机器人消息的链接
- android - 如何使用 NanoHttpd 开始在 Mi Video 上播放 .mkv 和 .mp4 视频而不读取整个文件(Android)
- r - 当我们在 R 中读取 csv 时,数值带有前缀 X
- .net - 在没有“Key”和“Value”关键字的情况下将包含字典的文档插入到 Cosmos DB
- c# - 实体框架:包含子实体的 AsNoTracking
- reactjs - 如何在 React 中使用可重用的导航栏更改每个页面的标题?
- angular - 滚动时如何使链接活动更改?
- reactjs - eslint 文件中的 moduleDirectory 是什么意思?
- vba - 如何创建一个在给定限制内选择随机数量的字符的 vba?