如何从数据缓冲区执行x86命令?

2023-11-23

我的问题主要是针对教授的,是关于以“奇怪”的方式使用 C++ 的。在 C++ 中,变量指针和函数指针之间并没有太大区别。我们可以像这样做一些无用的事情:

char* buff     = new char[32];
void (*func)() = (void (*)())buff;

但我们几乎创建了一个从未存在过的函数,对吧?如果我们更进一步,用存储在文件中的 x86 命令填充 buff 会怎么样?操作系统永远不会知道函数已被创建。

#include <iostream>
using namespace std;

// no stack push'ing or pop'ing, nothing to return
void func(void){cout << "Hello?";}

int main()
{
  char* x86_code = new char[6];

  x86_code[0]                 = 0x9A;          // call (far)
  *((__int32*)(x86_code + 1)) = (__int32)func; // load 32-bit address
  x86_code[5]                 = 0xC3;          // ret

  void (*x86_func)(void) = (void (*)(void))x86_code;
  x86_func();

  return 0;
}

调用 x86_func() 会产生运行时错误(违反读取位置 0xFFFFFFFF)。如果不是以这种方式,操作系统如何将其二进制文件或模块加载到 RAM 中?非常感谢。


事实上,您可以用 x86 机器代码填充数组并尝试执行它。它被称为外壳代码设法使应用程序或库在不打算执行此类代码时执行此类代码称为“漏洞利用”。

不幸的是,这并不容易,因为现代硬件和操作系统通常会阻止您从可写区域(例如非常量字符数组)执行代码。这称为 W^X(写入或执行权限,但不能两者兼而有之),但可以请求 POSIX 兼容操作系统禁用此类保护,方法是mprotect()功能。这是一个有效的示例,因为它启用了对相关机器代码字节数组的读、写和执行权限:

#include <stdio.h>
#include <stdint.h>
#include <sys/mman.h>


typedef int(*FUNKY_POINTER)(void);


char shellcode[] = {
    0xb8, 0x2a, 0x00, 0x00, 0x00, //mov    $0x2a,%eax
    0xc3                          //retq
};



int main(void){
    uintptr_t pageSize        = 4096;
    uintptr_t shellcodeAddr   = (uintptr_t)shellcode;
    uintptr_t pageAlignedAddr = shellcodeAddr & ~(pageSize-1);
    FUNKY_POINTER shellcodeFn = (FUNKY_POINTER)shellcode;

    /* Magic */
    mprotect((void*)pageAlignedAddr,
             (shellcodeAddr - pageAlignedAddr) + sizeof(shellcode),
             PROT_EXEC|PROT_WRITE|PROT_READ);

    printf("The answer to the ultimate question of life, "
           "the universe and everything is %d\n",
           shellcodeFn());

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从数据缓冲区执行x86命令? 的相关文章

  • 不同提供商的相同 EDMX 文件

    我正在开发一个项目 其中有一个本地数据库 SQL CE 在不存在与服务器的连接的情况下用作缓冲区 在服务器上我想使用相同的数据库布局 当然 我想使用服务器和客户端上可用的 Common dll 中的相同 EDMX 文件 在客户端中 我有一个
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • 是否有可能将 *.pdb 文件包含到发布版本中以查看错误行号?

    我做了一个项目 所有设置都是默认的 当我在调试模式 构建配置 调试 下运行它并遇到异常时 它转储到我的自定义日志记录机制 其中包含错误行号 但是当我运行发布构建时 记录相同的异常 没有行号 只有方法抛出和记录调用堆栈 是否有可能在发布配置
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • AcceptSocket 超时?

    是否有可能AcceptSocket on a TcpListener具有超时的对象 以便它偶尔被中断 TcpListener server new TcpListener localIP port server Start while sh
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 如何使用 C# 将表格粘贴到 Ms-Word 文档的末尾

    我有一个预制的 Word 模板 其中有一个表格 我想打开它 然后在文档末尾添加 粘贴 另一个表格 问题是它不会转到文档的末尾 而是将新表格粘贴到原始表格的第一个单元格中 任何帮助将不胜感激 previous code copied a ta
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • 如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果

    我正在使用 MStest 来测试我的控制器 我想测试这个动作 HttpGet Name GetGroups public async Task
  • Code::Blocks 中的调试似乎不起作用 - 缺少调试符号

    我正在尝试在 Code Blocks 中调试程序 我跟着本指南 http wiki codeblocks org index php title Debugging with Code Blocks and 这个短视频 http www y
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码

随机推荐

  • 无法在我的 C# 应用程序中添加静态端口映射

    我正在尝试在我的 C 应用程序中添加新的静态端口映射 因为我的应用程序作为服务器运行 并且我希望它侦听端口 8000 NATUPNPLib UPnPNATClass upnpnat new NATUPNPLib UPnPNATClass N
  • git:提交多个文件但添加消息

    我的存储库中有大量文件 有时我处理 20 个文件 并且想提交所有文件 但是 我想为每个添加一条消息 如何添加所有已更新的文件并为每个文件添加一条消息 而无需手动为每个文件运行命令 是否可以进行批量运行并提示我为每个运行添加一条消息 注意 您
  • 为什么人们捍卫正则表达式语法? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 有一个类似的问题 但它只是得到了人们总是给出的关于正则表达式语法的相同旧答案 但这不是这里的重点 所以请尽量不要下意识地提出关于正则表达式语法的相同旧答案 这次尝试更加原创和个性化 正则表
  • 将 RGB 颜色转换为英文颜色名称,例如使用 Python 的“green”

    我想将颜色元组转换为颜色名称 例如 黄色 或 蓝色 gt gt gt im Image open test jpg gt gt gt n color max im getcolors im size 0 im size 1 gt gt gt
  • 如何以编程方式设置 Admob appID (19.1.0)?

    Before 版本19 1 0 appID 可以通过编程方式设置 如下所示 MobileAds initialize Context context String appID 新方法是 initialize Context OnInitia
  • 从 VS 2015 和 EF7 的模型生成 SQLite 数据库

    我正在尝试利用 Entity Framework 7 和 SQLite 数据库文件制作 Windows Presenter Foundation 应用程序 我已经制作了 edmx 模型 但是当尝试生成模型时我无法建立 SQLite 连接 尝
  • 如何在百里香中转义双引号 " ?

    我想在 Thymeleaf 的字符串中添加双引号 我有以下形式的内容 td td 我想要的结果是 td Value of apple is 1 5 td 但我得到以下异常 EL1065E unexpected escape characte
  • z3 解数

    如何使用 z3 来计算解的数量 例如 我想证明对于任何n 方程组有 2 个解 x 2 1 y 1 1 y n 1 以下代码显示了给定的可满足性n 这不完全是我想要的 我想要任意的解决方案数量n usr bin env python from
  • 具有多个 Expects() 调用的 PHPUnit 模拟

    使用 PHPUnit 我想知道我们如何从同一个存根 模拟中获得多个期望 例如 我想测试模拟是否具有该方法display 调用并返回 NULL 我也想测试一下这个方法process 将被调用 事实上我的测试叫做testProcessIsCal
  • 选择元素的初始值

    我想初始化一个select具有初始值 我有一个从后端返回的 Json 对象 如下所示 Nom xxx TypeIld 1 Nom xxx TypeId 1 我有一个像这样声明的 typeId 数组 Nom Plats TypeId 0 No
  • 如何在 SwiftUI 中实现文本字段列表而不破坏删除

    When I 在 XCode 中创建主从应用程序 使用核心数据 向事件模型添加一个新字段 例如title as String 改变MasterView对此实施 struct MasterView View FetchRequest sort
  • SignInManager.PasswordSignInAsync 上“尚未为此 DbContext 配置数据库提供程序”

    Net Core 1 0 0 SDK 预览 2 x64 Net Core 1 0 0 VS 15 预览 2 x64 Net Core 1 0 0 运行时 x64 因此 我们将 RC1 应用程序更新到上述最新版本 经过几个小时的切换引用后 它
  • 在 GWT 超级开发模式下调试?

    到目前为止 在 GWT 超级开发模式下调试似乎真的很痛苦 如果有任何错误 则不会有堆栈跟踪 只有 Chrome 控制台中给出的神秘消息 有没有办法让所有错误打印堆栈跟踪 就像在开发模式下一样 我相信我已经有了源映射 因为如果我转到 Chro
  • Strapi V4 填充动态区域 媒体未填充

    通过使用下面建议的补丁 数据字段似乎填充正常 但是 媒体字段未填充 尝试了以下但没有运气 http localhost 1337 api pages populate protocol host port api pages populat
  • SwiftUI NavigationLink 自动弹出,这是意外的

    我在具有分割视图 横向 的 iPad 上使用 NavigationLink 时遇到一些问题 这是一个例子 这是重现该问题的代码 import SwiftUI final class MyEnvironmentObject Observabl
  • `if (isset($_SESSION))` 和 `if ($_SESSION)` 之间的区别?

    我注意到人们经常简单地写 当我一直在使用时 有人可以解释检查变量是否设置时的区别 这就是我使用它的目的 吗 在 PHP 中 如果变量不存在 未设置 那么 PHP 将输出一个E NOTICE错误 创建缺失的变量 并将其分配给NULL 如果您不
  • 删除所有列中具有相同值的行

    假设我有一个如下所示的数据框 df options stringsAsFactors F cars lt c Car1 Car2 Car3 Car4 Car5 Car6 Car7 Car8 Car9 test1 lt c 0 0 3 1 4
  • 在 Python3 和 Jupyter Notebook 中,“exit”关键字有什么作用?

    我目前在 Jupyter Notebook 中使用 Python3 我刚刚遇到了一个关键字exit 这个关键字有什么作用 with open some file txt as f for lines in f print lines exi
  • gson - 在序列化任何类型的对象时如何包含类名属性

    意识到在应用程序中序列化对象时 我需要将类名作为属性包含在内 如果我为序列化的任何非原始对象添加类名属性 这可能是最好的 我看到这是 Genson 的内置功能useClassMetadata方法 但我已经在我的项目中使用了 gson 所以如
  • 如何从数据缓冲区执行x86命令?

    我的问题主要是针对教授的 是关于以 奇怪 的方式使用 C 的 在 C 中 变量指针和函数指针之间并没有太大区别 我们可以像这样做一些无用的事情 char buff new char 32 void func void buff 但我们几乎创