标签: machine-code

如何判断二进制序列是否是x86机器码?

我们都知道,在x86 arch中,数据和代码混合在内存或磁盘中。但如何告诉他们呢?

\n\n

paper\xef\xbc\x8c 需要该方法,我不期望 100% 的准确度。80% 就可以了,甚至一些想法也可以:)

\n

x86 machine-code

2
推荐指数
1
解决办法
271
查看次数

跳过未知操作码:66,不是 8086 指令 - 尚不支持

我用的是emu8086。我有一个问题,要求我在从六段输入转换后显示我们在七段显示器上看到的内容。我应该以十六进制输入我的数据,如果它与七段表的十六进制输入匹配,则显示十进制数,例如。3FH = 0, 06H = 1。我使用数组来实现这个程序。下面是工作源程序:

\n
ORG 100H     \n\nMOV AL,[1840H]   \xef\xbc\x9binput in this memory location\nMOV CL,0AH       ; initialize length counter\n   \nAGAIN:  CMP AL,MSG+BX     ; compare to check if the data matches\n        JE RESULT         ; jump to RESULT if data matched\n        INC BX            ; increase decimal output by 1 if data not matched\nLOOP AGAIN\n\nMOV [1841H],0FFH          ; display FF if no data matched the array\n\nHLT\n\nMSG DB 3FH, 06H, 5BH, 4FH,66H, 6DH,7DH,07H,7FH,6FH        ; my array with hexa inputs\n\nRESULT: MOV [1841H],BL                 ; display …
Run Code Online (Sandbox Code Playgroud)

assembly machine-code opcode x86-16 emu8086

2
推荐指数
1
解决办法
8272
查看次数

x64 MOV 32位立即数到64位寄存器

本页代码部分的第二条指令:

x86

看起来像这样:MOV r9d, 0。编码如下:41 B9 00 00 00 00

唯一的问题是... Intel x64 手册中没有任何MOV指令可以获取 4 字节立即数并将其放入 64 位寄存器中。

这些是英特尔手册中的说明:

B0+ rb          MOV r8, imm8 Move imm8 to r8.
REX + B0+ rb    MOV r8***, imm8 Move imm8 to r8.
B8+ rw          MOV r16, imm16 Move imm16 to r16.
B8+ rd          MOV r32, imm32 Move imm32 to r32.
REX.W + B8+ rd  MOV r64, imm64 OI Valid N.E. Move imm64 to r64.
Run Code Online (Sandbox Code Playgroud)

该指令似乎有效,但是如何呢?

assembly x86-64 machine-code instructions immediate-operand

2
推荐指数
1
解决办法
3859
查看次数

继续获取 e8 00 00 00 00 作为机器代码以在汇编中调用函数

我知道objdump -dr在我的文件call中使用时会出现在机器代码中,e8 00 00 00 00因为它尚未链接。但是我需要找出00 00 00 00链接器完成它的工作后会变成什么。我知道它应该计算偏移量,但我对此有点困惑。

以下面的代码为例,链接器部分完成后,应该如何e8 00 00 00 00?我如何得到这个答案?

我正在使用此示例代码进行测试:(我正在尝试调用 moo)

Disassembly of section .text:

0000000000000000 <foo>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   89 7d fc                mov    %edi,-0x4(%rbp)
   7:   8b 45 fc                mov    -0x4(%rbp),%eax
   a:   83 e8 0a                sub    $0xa,%eax
   d:   5d                      pop    %rbp
   e:   c3                      retq   

000000000000000f <moo>:
   f:   55                      push   %rbp
  10:   48 89 e5                mov    %rsp,%rbp
  13: …
Run Code Online (Sandbox Code Playgroud)

x86 assembly linker machine-code disassembly

2
推荐指数
1
解决办法
873
查看次数

AMD ryzen 7 2700指令集是什么(用于创建汇编程序)

我想创建我的第一个汇编程序,这样我就可以编写我自己的程序语言、我自己的操作系统等等。只有一个问题:

我找不到 ryzen 7 2700 的指令集。我已经发现它使用 zen+ 架构,但我也找不到相关的东西。有谁知道我在哪里可以找到完整的指令集,其中包含 CPU 能够执行的所有操作以及所有寄存器名称等?这真的很有帮助。

顺便问一下:你知道一个汇编程序的开源代码供我学习吗?我对这个主题很陌生,所以我首先必须了解很多相关知识,并认为这将是学习如何完成汇编程序编码的机会。我也将感谢有更多的东西可供阅读和其他我可以学习的东西!

binary assembly x86-64 instruction-set machine-code

2
推荐指数
1
解决办法
5100
查看次数

避免使用 CALL 读取 RIP 的 shellcode 中的 0xFF 字节?

我正在尝试编写解码器存根,但遇到了0xFF作为坏字符的限制。我正在使用该jmp-call-pop方法将我编码的 shellcode 的地址放入一个寄存器中。这是相关的片段:

401012: e8 eb ff ff ff          call   0x401002
Run Code Online (Sandbox Code Playgroud)

似乎call总是0xFF以字节为单位使用。是否有另一条指令在执行时会压入rip堆栈并跳转到另一段代码?我试过手动将地址推送到堆栈上,但这会导致空字节,因为我的地址有 3 个字节长并且需要填充。


我的机器代码中不允许的字节是:

  • 00
  • FF

assembly x86-64 machine-code shellcode

2
推荐指数
1
解决办法
699
查看次数

x86 中哪些 MOV 指令未使用或最少使用,可用于自定义 MOV 扩展

我正在 gem5 模拟器中的 X86 架构中对自定义 MOV 指令进行建模,为了在模拟器上测试其实现,我需要使用内联汇编来编译 C 代码以创建二进制文件。但由于它是一条自定义指令,尚未在 GCC 编译器中实现,因此编译器会抛出错误。我知道一种方法是扩展 GCC 编译器以接受我的自定义 X86 指令,但我不想这样做,因为它更耗时(但稍后会这样做)。

作为临时黑客(只是为了检查我的实现是否值得)。我想编辑已经存在的 MOV 指令,同时更改模拟器中的底层“微操作”,以便欺骗 GCC 接受我的“自定义”指令并进行编译。

因为 x86 架构中有多种类型的 MOV 指令。因为它们是86架构参考中的各种MOV指令。

因此,我的问题是,哪条 MOV 指令使用最少,我可以编辑其底层微操作。假设我的工作负载仅包括整数,即很可能不会使用 xmm 和 mmx 寄存器,并且我的指令反映了 MOV 指令的相同实现。

x86 gcc machine-code inline-assembly gem5

2
推荐指数
1
解决办法
1044
查看次数

位移值对 ModRegRm 字节的 Mod 字段有什么影响?

我正在编写一个 8086 汇编器,它接受指令并生成 8086 机器代码。我使用《Intel 8086 用户手册》作为参考。

为了说清楚,我将解释一下情况。假设我想汇编这条指令mov ax, bx。我查手册发现,当 的操作数mov是 2 个 16bit 寄存器时,操作码mov0x89和 来指定操作数(源和目的),mov在这种情况下,后面跟着一个 ModRegRm 字节,指定源以及目的地,在本例中为0xd8。二进制中的该字节 = 11011000.

Mod为2位,Reg、Rm各为3位。所以,Mod = 11,Reg = 011,Rm = 000。这里很简单,但有一些我不明白的地方,那就是寻址模式和位移。

modregrm 表

查看表格和以下三个指令及其机器代码。

mov [bx+0x6], ax ;894706

mov [bx+0xbf],ax ;8987BF00

mov [bx+0xffff],ax ;8947FF

我假设每条指令的位移长度分别为8位、8位、16位,这是否错误?

我认为我是对的,因为它很明显,0x6分别0xbf是 1 字节和0xffff2 字节。

问题是,为什么第二条指令中的MOD字段是10b or 0x02而不是01b or 0x01?应该是0x01因为位移是8bit位移吧?为什么位移量是 16 位,MOD 却0x01在第三条指令中?为什么汇编器忽略其余的位移并仅捕获 1 个字节?

assembly machine-code sign-extension addressing-mode x86-16

2
推荐指数
1
解决办法
932
查看次数

装配展示台

我四处寻找一个程序集可视化工具,类似于正则表达式网站如何向您展示它的解释,或者 BF(语言)可视化工具向您展示它如何通过堆栈,在线某个地方是否有类似的程序集?

Brainfuck 示例: https: //fatiherikli.github.io/brainfuck-visualizer/

assembly reverse-engineering machine-code

2
推荐指数
1
解决办法
2246
查看次数

使用立即数操作数对 x86-16 指令进行编码

我正在尝试解码指令,目前在 80x86 16 位机器上,在解码没有立即值作为源操作数的指令时没有太多问题,当源操作数不再是寄存器或寄存器时,就会出现问题。位置内存而是一个立即值。下面的指令我会这样解码:

mov ax, 3

101110|11| |11|000|000| 00000011 -> 3 with sign expansion
      |       |   |  register AX
      s = 1   |  null
      w = 1   |
              the second operand is a register
Run Code Online (Sandbox Code Playgroud)

相反,这是不公平的。这是正确的解码:

mov ax, 3

10111000 00000011 0000000
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下假设源操作数是立即值的话解码是如何工作的吗?

x86 assembly machine-code instruction-encoding

2
推荐指数
1
解决办法
730
查看次数