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