跳转到汇编中的地址

时间:2019-07-04 23:00:09

标签: assembly x86-64 nasm elf memory-address

我试图跳到内存中的地址,但这只是文件中的偏移量,所以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文件中插入一些代码,我需要更改可执行文件的入口点,然后再跳回,因为起初我不知道要跳到哪里,所以我在内存中放置了一个值{ {1}},我将以程序的原始入口点为例进行更改,例如我给出的例子,假设我们有一个偏移量为0x111111111111的原始入口点,我应该访问类似{ {1}},而不是那个,我跳到文件的偏移位置。

我正在使用Ubuntu。

1 个答案:

答案 0 :(得分:1)

您可能想构建非PIE可执行文件开始,因此,对于可执行文件的基地址没有ASLR,事情变得更加简单。使用gcc -no-pie -static foo.o。这样objdump就可以为您提供绝对地址。

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

使用mov r64, imm64只会让您自己陷入困境,因为您尝试使用没有运行时修复程序的绝对地址,但是除非您针对以下情况禁用了ASLR,否则您的程序在映射到0x5555...附近时将被ASLR处理。 (例如,通过在GDB下运行),或在/ proc / sys中全局安装。