我有一个用英特尔语法制作的 asm 程序。在这个程序中,我使用了jz $+1来自 INTEL (+gcc) 的语法,这意味着我跳转到jz指令(2 个字节)。我在当前指令之后再跳 1 个字节。我试图找到在 GAS AT&T 语法中做同样事情的正确语法是什么,但我找不到相关信息。有人知道吗?
什么是 GAS 语法中 jmp $+1 中的美元符号的等价物?
逆向工程
部件
英特尔
气体
2021-06-20 14:49:57
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)