跳转到汇编中的地址

Jumping to address in 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,我将通过程序的原始入口点进行更改,例如我给出的例子,假设我们在偏移量 0x530 处有一个原始入口点,我应该访问计算机的内存像 0x55555555fff530,而不是那个,我跳转到文件的偏移量。

我正在研究 Ubuntu。

您可能希望首先构建 non-PIE 个可执行文件,因此对于 base-address 可执行文件没有 ASLR,事情会更简单。使用 gcc -no-pie -static foo.o。那么objdump就能给你绝对地址了

或者只使用 RIP-relative LEA 来获取二进制 的相同 section/segment 中其他代码的地址。该偏移量在 link 时间(或 edit-binary 时间)已知。

使用 mov r64, imm64 只会让你自己过不去,因为你试图在没有运行时修正的情况下使用绝对地址,但你的程序在映射到 0x5555... 附近的某个地方时将被 ASLRed,除非你禁用它的 ASLR(例如通过 运行 它在 GDB 下),或全局 /proc/sys.