assembly - 在汇编中跳转到地址
问题描述
我试图跳转到内存中的一个地址,但它只是文件中的偏移量,所以 0x530 而不是 0x555555 .... 但我不知道该怎么做。这是代码。
global _start
_start:
push rax
push rdi
push rsi
push rdx
mov rax,1
mov rdi,1
lea rsi,[rel msg]
mov rdx,msg_end - msg
syscall
pop rdx
pop rsi
pop rdi
pop rax
mov rax,0x1111111111111111
jmp rax
align 8
msg db "....WOODY....",10,0
msg_end db 0x0
这里我移动到 0x11111111111,在执行文件之前我将这个值更改为 0x530,所以它会给出mov rax,0x530
,但是我不知道如何获取绝对地址。
基本上我试图在 ELF 文件中注入一些代码,我需要更改可执行文件的入口点然后跳转回来,因为我一开始不知道跳转到哪里我在内存中放了一个值0x111111111111
,我会通过程序的原始入口点进行更改,例如我给出的示例,假设我们在 offset 有一个原始入口点0x530
,我应该访问计算机的内存0x55555555fff530
,而不是那样,我跳到偏移量文件。
我在 Ubuntu 上工作。
解决方案
您可能希望从构建非 PIE 可执行文件开始,因此对于可执行文件的基地址没有 ASLR,事情会变得更简单。使用gcc -no-pie -static foo.o
. 然后objdump
就能给你绝对地址。
或者只是使用相对于 RIP 的 LEA 来获取二进制文件同一部分/段中其他代码的地址。该偏移量在链接时(或在编辑二进制时)是已知的。
使用mov r64, imm64
只是让你自己的生活变得困难,因为你试图使用没有运行时修复的绝对地址,但是当你的程序映射到附近的某个地方时,你的程序将被 ASLRed,0x5555...
除非你为它禁用 ASLR(例如通过在 GDB 下运行它),或者全局/proc/系统。
推荐阅读
- mongodb - 时间:MongoDB 中的日期和时间
- qml - 创建新的自定义 QtQuick 视图以与模型一起使用
- dax - DAX - 在值字段中删除月份名称列错误
- php - 自我注射是一种好习惯吗?PHP中的相同类注入编程模式
- javascript - 是否可以从 JavaScript 中的子类导入父模块?
- node.js - NodeJS (express) + Socket.io - 各种错误
- javascript - JavaScript:如何映射两个对象以获得将第一个对象的 ID 映射到另一个对象的名称的输出?
- html - div下拉菜单不显示
- android - 如何通过 Camera2/CameraX API 使用最广角镜头
- algorithm - 从最小生成树中创建 N-Clusters?