gcc jmp [rip+foo]的linux内联扩展asm表示是什么?

eivnm1vs  于 2022-12-29  发布在  Linux
关注(0)|答案(1)|浏览(164)

作为后续行动: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之后的四元组字就是要使用的跳转地址。
谢啦,谢啦

col17t5w

col17t5w1#

您可以使用:

__asm__ __volatile__(
    "jmp *1f(%%rip)\n\t"
    "1: .quad %p0"
    :: "i" (0x12345678abcdef00ULL));
__builtin_unreachable();

注意你的地址需要是一个编译时常量。

相关问题