如果声明为无符号字符的矢量,则Shellcode未运行

Shellcode not running if declared as vector of unsigned chars

本文关键字:Shellcode 运行 声明 无符号 字符 如果      更新时间:2024-09-23

为什么外壳代码没有在这个示例中运行

示例1

std::vector<unsigned char> decrypted(encrypted.size());
void *exec = VirtualAlloc(0, decrypted.size(), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, &decrypted.front(), decrypted.size());
((void(*)())exec)();

当我键入cout << &decrypted.front()时,我在控制台中获得有效载荷并添加> out.txt,我将有效载荷保存到文本文件中,然后在记事本中查看,复制它,然后与一起使用

示例2

unsigned char out[] = "x01x01x01x01x01"
void *exec = VirtualAlloc(0, sizeof(out), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, out, sizeof(out));
((void(*)())exec)();

向量不是一个动态数组吗如果我可以用*decrypted.front()将外壳代码输出到屏幕上,那么我应该能够将其传递给memcpy

从实施例1获得的相同有效载荷在实施例2中运行良好

memcpy采用两个指针,即目标和源。在示例1中,源是临时迭代器的地址,而不是向量下数组的开头,因此您要复制的不是向量中的数据,而是迭代器中的字节。

如果要使用memcpy,则需要使用两个数组或指向缓冲区的指针来复制数据,或者可以使用迭代器将数据从一个位置复制到另一个位置,但不能同时复制。