获取操作码的简单方法

问题描述 投票:0回答:5

我知道如何从可执行文件中获取操作码和相应的汇编语法;然而,有没有一种简单的方法可以单独获取特定汇编指令的操作码,而无需使用相同的程序编写程序,然后手动链接和加载它并对可执行文件执行 objdump?

有没有一种简单的方法可以找到特定指令对应的操作码?

assembly x86
5个回答
5
投票

您可以使用 gdb(GNU 调试器)的 x/bx 命令。

我在这里做了一个教程:
http://aimbots.net/tutorials/9276-how-get-op-codes.html
http://aimbots.net/threads/9276-如何获取-OP-codes

https://web.archive.org/web/20180814185730/http://aimbots.net/threads/9276-How-to-get-OP-codes

假设您需要特定汇编指令的操作代码(例如 x64 指令,以覆盖 C 代码。)

查找操作码的一种方法是阅读英特尔开发人员手册。 不幸的是,这需要很长时间,而且几乎永远不会导致正确的发现。

所以这是快速的方法,gdb 方法。

假设我们想要 jmp rel32 和 call 的 OP 代码

做到这一点的方法是编写一个小型汇编程序。

.section .data
text: .ascii "hello\n"
.section .text
.globl _start
_start:
    jmp 10000000
    call 7500000
    movl $4, %eax
    movl $1, %ebx
    movl $text, %ecx
    movl $6, %edx
    int $0x80
exit:
    movl $1, %eax
    movl $0, %ebx
    int $0x80 #linux equivalent to int 21h

另存为lookup.gas

编译:

as lookup.gas -o lookup.o
ld -o lookup lookup.o

现在,在 gdb 中打开它:
gdb 查找

gdb lookup
GNU gdb 6.8-debian
Copyright © 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(no debugging symbols found)
(gdb) disas _start
Dump of assembler code for function _start:
0x08048074 <_start+0>: jmp 0x989680
0x08048079 <_start+5>: call 0x7270e0
0x0804807e <_start+10>: mov $0x4,%eax
0x08048083 <_start+15>: mov $0x1,%ebx
0x08048088 <_start+20>: mov $0x80490a0,%ecx
0x0804808d <_start+25>: mov $0x6,%edx
0x08048092 <_start+30>: int $0x80
End of assembler dump.
(gdb) x/bx _start+0
0x8048074 <_start>: 0xe9
(gdb) x/bx _start+5
0x8048079 <_start+5>: 0xe8
(gdb) q

--> JMP REL32 = 0xE9y
--> 调用 = 0xE8

由于 gdb 和 GAS 在 Windoze 上也可用,因此您也可以在那里进行操作...

PS:如果你不喜欢 AT&T 汇编语法:

; yasm -f elf32 jmprel32.nasm -o jmprel32.o
; ld -o jmprel32 jmprel32.o

; or

; nasm -f elf jmprel32.nasm
; ld -s -o jmprel32 jmprel32.o


section .data

section .text
    global _start

_start:
    jmp exit
    jmp 1234567890
    call 1234567890
exit:
    mov eax,1           ; The system call for exit (sys_exit)
    xor ebx,ebx         ; Exit with return code of 0 (no error)
    int 80h

所以

GNU gdb 6.8-debian
Copyright © 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(no debugging symbols found)
(gdb) disas _start
Dump of assembler code for function _start:
0x08048060 <_start+0>: jmp 0x804806c <_start+12>
0x08048062 <_start+2>: jmp 0x519a8334
0x08048067 <_start+7>: call 0x519a8339
0x0804806c <_start+12>: mov $0x1,%eax
0x08048071 <_start+17>: xor %ebx,%ebx
0x08048073 <_start+19>: int $0x80
End of assembler dump.
(gdb) x/bx _start+2
0x8048062 <_start+2>: 0xe9
(gdb) x/bx _start+7
0x8048067 <_start+7>: 0xe8
(gdb) x/bx _start+0
0x8048060 <_start>: 0xeb
(gdb) q

4
投票

对于 x86,您可以在 Intel 手册中查找它们(第 1 部分 (A-M)第 2 部分 (N-Z))。不,我不知道为什么手册分为两部分。


4
投票

我不久前问过类似的问题(DOS debug like program for 32-bit x86 assembly)。

有人好心地为我提供了一个自动脚本来执行此操作。 您可以点击问题链接,或参考下面他们提供给我的脚本...

opcode() {
  echo $* > tmp.S && nasm tmp.S -o tmp.o && od -x tmp.o
  rm -f tmp.o tmp.S
}

希望这有帮助。


3
投票

X86 操作码和指令参考包含一堆指令参考表及其在 32 位和 64 位 x86 处理器上对应的操作码。


1
投票

我不确定你为什么需要操作码。 但如果是用于漏洞利用开发,您可能已经拥有metasploit,它附带了一个非常有用的ruby脚本,名为nasm_shell.rb(在工具目录中)。

您输入的每一行都会以正确操作码的 ascii 十六进制表示形式出现。

如果出于其他目的,或者您不希望像metasploit这样的重量级工具包因某种原因而存在,您可以直接拉出脚本并安装其依赖项。 它使用 Rex 并假设已安装 nasm。

如果你想修改它,你需要的实际代码只是函数 shell.run 中的几行

© www.soinside.com 2019 - 2024. All rights reserved.