首页 > 解决方案 > 在汇编中跳转到地址

问题描述

我试图跳转到内存中的一个地址,但它只是文件中的偏移量,所以 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 上工作。

标签: assemblyx86-64nasmelfmemory-address

解决方案


您可能希望从构建非 PIE 可执行文件开始,因此对于可执行文件的基地址没有 ASLR,事情会变得更简单。使用gcc -no-pie -static foo.o. 然后objdump就能给你绝对地址。

或者只是使用相对于 RIP 的 LEA 来获取二进制文件同一部分/段中其他代码的地址。该偏移量在链接时(或在编辑二进制时)是已知的。

使用mov r64, imm64只是让你自己的生活变得困难,因为你试图使用没有运行时修复的绝对地址,但是当你的程序映射到附近的某个地方时,你的程序将被 ASLRed,0x5555...除非你为它禁用 ASLR(例如通过在 GDB 下运行它),或者全局/proc/系统。


推荐阅读