我试图跳到内存中的地址,但这只是文件中的偏移量,所以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。
答案 0 :(得分:1)
您可能想构建非PIE可执行文件开始,因此,对于可执行文件的基地址没有ASLR,事情变得更加简单。使用gcc -no-pie -static foo.o
。这样objdump
就可以为您提供绝对地址。
或仅使用相对RIP的LEA来获取二进制文件同一节/段中其他代码的地址。该偏移量在链接时(或在编辑二进制时)是已知的。
使用mov r64, imm64
只会让您自己陷入困境,因为您尝试使用没有运行时修复程序的绝对地址,但是除非您针对以下情况禁用了ASLR,否则您的程序在映射到0x5555...
附近时将被ASLR处理。 (例如,通过在GDB下运行),或在/ proc / sys中全局安装。