什么是 GAS 语法中 jmp $+1 中的美元符号的等价物?

逆向工程 部件 英特尔 气体
2021-06-20 14:49:57

我有一个用英特尔语法制作的 asm 程序。在这个程序中,我使用了jz $+1来自 INTEL (+gcc) 的语法,这意味着我跳转到jz指令(2 个字节)。我在当前指令之后再跳 1 个字节。我试图找到在 GAS AT&T 语法中做同样事情的正确语法是什么,但我找不到相关信息。有人知道吗?

2个回答

这不是真正的 RE 问题,但我认为.用于指代许多 GAS 架构中的当前位置。

如果您更喜欢 gas 并使用 $+1 跳转到指令的中间,则可以使用 intel 语法

$ cat foo.s

.intel_syntax noprefix
.global start
        _start:
        jz $+1
        .byte 0x25,0x45,0x33,0x40,0x00

集合

$ as -o foo.o foo.s

拆卸

$ objdump.exe -d foo.o
foo.o:     file format pe-x86-64
Disassembly of section .text:
0000000000000000 <_start>:
   0:   74 ff                   je     1 <_start+0x1>
   2:   25 45 33 40 00          and    $0x403345,%eax
   7:   90                      nop
   8:   90                      nop

关联

$ ld -m i386pep -o foo foo.o

调试

$ gdb ./foo
GNU gdb (GDB) 8.2.1

(gdb) break _start
Breakpoint 1 at 0x100401000
(gdb) r
Starting program: 
[New Thread 7876.0x2614]

Breakpoint 1, 0x0000000100401000 in __rt_psrelocs_start ()
(gdb) x/2i $rip
=> 0x100401000 <__rt_psrelocs_start>:
    je     0x100401001 <__rt_psrelocs_start+1>
   0x100401002 <__rt_psrelocs_start+2>: and    $0x403345,%eax

(gdb) si
0x0000000100401001 in __rt_psrelocs_start ()
(gdb) x/2i $rip
=> 0x100401001 <__rt_psrelocs_start+1>:
    jmpq   *0x403345(%rip)        # 0x10080434c

   0x100401007 <__rt_psrelocs_start+7>: nop
(gdb)