作为后续行动:JMP绝对远64位地址。
我需要在linux扩展汇编中编写与here相同的代码,其中foo是64位绝对地址。
jmp [rip+foo]
或者我需要gcc/g ++来编译下面的程序集:第25页00 00 00 00 xx xx xx xx xx xx xx xx
其中,xx xx xx xx xx xx xx xx xx是来自扩展装配线的64位绝对地址。
我可以在一个单独的. s文件中编写程序集,然后与我的c文件链接,但我更喜欢将它包含在我的c文件中。
编译员抱怨了以下所有问题:
x一个一个一个一个x一个一个二个x
我相信'*'是间接访问,这可能是不需要在这里,但试图看看什么会编译。
关于反馈:asm("jmp *%0"::"r"(绝对地址));以下是输出:
00000000000000f1 <_Z11asmFarJmp64m>:
f1: f3 0f 1e fa endbr64
f5: 55 push %rbp
f6: 48 89 e5 mov %rsp,%rbp
f9: 48 89 7d f8 mov %rdi,-0x8(%rbp)
fd: 48 8b 45 f8 mov -0x8(%rbp),%rax
101: ff e0 jmp *%rax
103: 90 nop
104: 5d pop %rbp
105: c3 ret
不幸的是,我不能在实际跳转之前删除任何寄存器,包括rax。这是一个单向跳转,需要像这样的中间跳转:"ff 25 00 00 00 00 xx xx xx xx xx xx xx"我知道这是一个非常特殊的用例。
如何在inline asm中应用. quad?我看到它被用作数据区初始化内存的限定符。我试图Assert它为"jmp.quad ...",但编译器抱怨。
谢啦,谢啦
关于"ff 25 00 00 00 00 xx xx xx xx xx"
我编写了一个asm文件进行测试,并使用nasm进行编译,其中测试目标地址为0x12345678aabbccdd
SECTION .text
;;jmp 0x12345678aabbccdd
db 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0xaa, 0xbb, 0xcc, 0xdd
对象转储为:
jmp64.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <.text>:
0: ff 25 00 00 00 00 jmp *0x0(%rip) # 0x6
6: 12 34 56 adc (%rsi,%rdx,2),%dh
9: 78 aa js 0xffffffffffffffb5
b: bb .byte 0xbb
c: cc int3
d: dd .byte 0xdd
objdmp没有将此读取为64位绝对jmp?可能objdmp没有更新以正确解码此?
正如Jester提到的,它被正确地解码了。我后来意识到:
"ff 25 00 00 00 00"就是jmp四元组指针[rip +0000],意思是偏移量0000正好在此rawinst的指令大小之后。因此,紧跟此rawinst之后的四元组字就是要使用的跳转地址。
谢啦,谢啦
1条答案
按热度按时间col17t5w1#
您可以使用:
注意你的地址需要是一个编译时常量。