如何获取没有0x00或0xFF字节的x86_64中的指令指针?

2024-03-31

有没有一种方法可以在不使用指令指针(RIP)的情况下访问指令指针(RIP)中的值call随后是一个pop用汇编语言?或者是否有机器代码操作码可以做到这一点?

我一直在谷歌搜索没有明确的结果。

我的问题是机器代码中不能有任何零,否则我会收到 SIGSEGV 错误。这是由于服务器加载代码并从字节字符串执行它的方式所致。近调用与子例程的距离为零,因此不能选择使用 call。

我使用的是 64 位 Linux,并且有 nasm 和 yasm。


In x86_64 the standard way is to use RIP-relative addressing instead of CALL like in x86. Even then, call/pop is not a recommended way1

通常你会使用lea rax, [rip]将 RIP 放入 RAX(实际上编码为lea rax, [rip + 0]末尾有四个字节作为立即数)。然而自从LEA不会取消引用内存地址,您只需将任何常量位移添加到 RIP 中,然后再减去它

0:  48 8d 05 04 03 02 01    lea    rax,[rip+0x1020304]
7:  48 2d 04 03 02 01       sub    rax,0x1020304

您可以选择任何没有零或 0xFF 字节的立即值。如果你想要指令的地址lea(7个字节长)你可以相应地修复sub rax, 0x01020304 - 7


1The recommended way http://blogs.msdn.com/b/oldnewthing/archive/2004/12/16/317157.aspx is

GetCurrentAddress:
    mov eax, [esp]
    ret
...
    call GetCurrentAddress
    mov [currentInstruction], eax

以避免调用堆栈和返回堆栈缓冲区 (RSB) 之间不匹配。但在 shellcode 中可能并不重要

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

如何获取没有0x00或0xFF字节的x86_64中的指令指针? 的相关文章

  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 高效memcspn

    有谁知道 memcspn 函数的有效实现吗 它的行为应该类似于 strcspn 但在内存缓冲区中查找跨度 而不是在以 null 结尾的字符串中查找跨度 目标编译器是 VisualC 谢谢 卢卡 一种近乎最佳的实现 size t memcsp
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 为什么在展开的 ADD 循环内重新初始化寄存器会使其运行速度更快,即使循环内有更多指令?

    我有以下代码 include
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • 无法识别的仿真模式:MinGW32 上的 elf_i386

    我正在尝试制作内核 但无法链接C与程序集一起输出 这ld 我收到错误 无法识别的仿真模式 elf i386 我正在使用 Windows 10 专业版以及 MinGW32 和 MSYS 我正在使用的代码 link ld link ld OUT
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

    也许我在架构上存在误解 但如果机器有 比如说 乘法指令 该指令是否未转换为更小的指令 或者过于复杂以至于最终与等效的 RISC 指令具有相同的速度 乘法是一个不好的例子 它在两种体系结构中都是一条指令 将上面的 乘法 替换为 CISC 中更
  • 调用可以是 cdecl 或 stdcall 的函数

    我需要编写调用外部函数的代码 该函数可以是 32 位 Windows 应用程序中的 stdcall 调用或 cdecl 我的代码 调用者 无法提前知道其中的哪一个 现在 如果我尝试从定义为 stdcall 的调用站点调用 cdecl 函数
  • 如何在 MacOS 上使用 nasm 进行编译

    我正在尝试在汇编器上编译并链接我的第一个程序 我尝试编译以下代码 include stud io inc global main section text main xor eax eax again PRINT Hello PUTCHAR
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • 汇编语言程序中连续两次相乘

    我正在使用 8086 模拟器以及 DOSBOX 和 MASM 我知道当我们将 8 位与 8 位相乘时 答案将是 16 位 al 8 bit ax 当我们将 16 位与 16 位相乘时 答案将是 32 位 ax 16 bit dx ax 但如
  • 在 qemu 中将扇区加载到 RAM

    我编写了一个简单的程序 将扇区 扇区编号 2 加载到 RAM 但什么也没打印 首先 我尝试了以下引导扇区代码 org 0x7c00 mov ax 0x1000 ES BX 1000 0000 mov es ax mov bx 0x00 Lo

随机推荐

  • 根据年份合并 data.frames 并填写缺失值

    我有两个 data frames 我想将它们合并在一起 第一个是 datess lt seq as Date 2005 01 01 as Date 2009 12 31 days sample lt data frame matrix nc
  • JavaFX:如何在不关注主窗口的情况下关闭子窗口

    我试图在一定时间后以编程方式关闭子窗口 这个子窗口的initOwner是与主舞台一起设置的 但是关闭这个子窗口后 主窗口就会获得焦点 有什么方法可以在不关注主窗口的情况下关闭子窗口 以编程方式 下面是我的问题的快速演示 我尝试了所有可能的方
  • OSX 上“没有名为 _scproxy 的模块”

    我使用的是预装 python 2 6 的 OSX 10 6 并且想通过 easy install 或 setup py 在下载的包中 安装 python 包 就我而言 我正在尝试安装 MySQLdb 在这两种情况下 我都会得到一个堆栈跟踪
  • 在处理其他事情时如何将一堆未提交的更改放在一边

    如果我有一堆未提交的更改 并且想在处理其他事情时将其放在一边 然后稍后 例如几天后 返回并继续工作 完成此任务最简单的工作流程是什么 到目前为止我只体验过 Mercurial 的基本功能 我通常的方法是使用克隆创建一个新分支 但可能有更好的
  • 自动布局问题 Xcode 8 [_SwiftValue nsli_superitem]

    将我的代码转换为 Swift 3 我发现了一个奇怪的问题 现在 2016 年 9 月 15 日 Xcode 8 公共版本 已经发布 转换代码后 我的应用程序崩溃了 没有明显的原因 自动布局有问题 日志显示如下 SwiftValue nsli
  • Android,在库项目中提供应用程序特定常量的最佳方式?

    我正在为许多 Android 应用程序创建一个库项目 这些应用程序都具有一些我希望包含在库项目中的通用功能 但库项目功能需要使用特定于应用程序的常量 所以我正在寻找一种方法来为库函数提供常量名称并允许每个应用程序定义它们 特定应用程序常量的
  • data.table 中的 Between 与 inrange

    In R s data table 什么时候应该选择 between and inrange 用于子集化操作 我已阅读帮助页面 between我仍然对这些差异感到摸不着头脑 library data table X data table a
  • 屏幕阅读器何时应该可以使用“隐藏”元素(为了可访问性,a11y)?

    我听到建议 hidden类不作为 hidden display none 但将其宽度和高度设置为 1 并使用剪切等 使元素看起来仍然存在于屏幕上 但内容不可见 但是 当我们使用 JavaScript 隐藏某些内容时 该元素的目的就已经完成
  • 查找 JUnit TestCase 中测试方法的数量

    有没有办法知道测试用例中测试方法的数量 我想做的是有一个测试用例来测试几种场景 对于所有这些我只会执行一次 data setUp 同样 我想在所有测试方法结束时进行一次清理 tearDown 我当前使用的方法是维护一个计数器来记录文件中存在
  • Angular 2 - 如何在组件中包含 javascript?

    我对 Angular 完全陌生 直接开始使用 Angular 2 Angular 的一大优点是我可以模块化网页的每个功能 组件有自己的 html 和样式表 但是他们自己的 javascript 文件呢 我怎样才能包含它自己的特定 javas
  • 使用 powershell 获取家庭网络上的设备名称及其 IP 地址

    这个问题是由于尝试管理我的家庭 WiFi 网络而产生的 我一直在尝试 get netipaddress ipconfig 和 nslookup exe 等命令 以下命令有点引导我到某个地方 但它没有我正在寻找的信息 Get NetIPAdd
  • Zend_Form_Element_MultiCheckbox:如何将一长串复选框显示为列?

    所以我正在使用Zend Form Element MultiCheckbox显示一长串复选框 如果我简单地echo元素 我得到很多由分隔的复选框 br 标签 我想找出一种方法来利用简单性Zend Form Element MultiChec
  • 允许 Django Rest Framework 序列化器字段名称中使用连字符

    鉴于我正在编写代码的 OpenAPI 规范需要在请求正文中使用连字符大小写 又名短横线大小写 变量名称 那么在使用 Django Rest Framework 时应如何处理 例如 一个请求POST thing创建一个具有以下主体的事物 ow
  • node.js - 将数据推送到客户端 - 只能连接一个客户端?

    我正在尝试创建一个服务器端解决方案 通过 node js 定期将数据推送到客户端 无客户端轮询 连接应该永久打开 每当服务器有新数据时 它就会将其推送到客户端 这是我的简单示例脚本 var sys require sys http requ
  • 为什么测试时一定要用DataParallel?

    在GPU上训练 num gpus设置为1 device ids list range num gpus model NestedUNet opt num channel 2 to device model nn DataParallel m
  • 是否可以访问用户订阅的 Firebase 主题?

    我目前正在尝试将我的应用程序迁移到 firebase 并且我正在寻找与 Parse Installations and Channels 等效的 Firebase 我发现我们应该在我的应用程序中使用主题 订阅 和 取消订阅 主题很常见 但
  • 是否可以处理 HTML 输入字段中的向上/向下键?

    我正在为输入文本字段构建自动完成功能 目前我可以使用鼠标单击来选择选项 我想添加键盘控制以允许自动完成控制 我监控了onkeyup事件中的键码 出现向上 向下键 键码都是0 我想知道是否有更好的方法可以做到这一点 Thanks 键码 37
  • android marshmallow中“身份”的应用程序权限在哪里

    我正在尝试使用 Android Studio 附带的模拟器来查看用户可以从此设备启用 禁用哪些权限 虽然开发人员可以声明他需要访问 身份 或联系人卡 但似乎在模拟器中 没有选项可以显示已禁用 身份 访问的应用程序 这是否意味着用户无法拒绝访
  • windows下无法使用mingw/gdb在eclipse helios cdt上调试小程序,控制台冻结

    我一直在尝试使用 Eclipse CDT 来做一些 C 示例 我可以使用 run 命令很好地运行它们 但是每当我尝试调试时 控制台窗口就会冻结 我可以输入 但程序不运行不继续了 当我调试时 我在控制台窗口上得到以下输出 没有断点 但由于默认
  • 如何获取没有0x00或0xFF字节的x86_64中的指令指针?

    有没有一种方法可以在不使用指令指针 RIP 的情况下访问指令指针 RIP 中的值call随后是一个pop用汇编语言 或者是否有机器代码操作码可以做到这一点 我一直在谷歌搜索没有明确的结果 我的问题是机器代码中不能有任何零 否则我会收到 SI