【发布时间】:2017-06-27 13:41:18
【问题描述】:
是否有一些工具可以将原始十六进制反汇编成汇编指令?例如:假设我们有 \xeb\x1d 根据this 在线反汇编程序反汇编成 jmp 0x1f。那么有一些离线工具吗?我试过 ndisasm 它没有给我正确的输出。
ndisam -b32foo 给我:
输出:
00000000 5C pop esp<br>
00000001 7833 js 0x36<br>
00000003 315C7865 xor [eax+edi*2+0x65],ebx<br>
00000007 620A bound ecx,[edx]
应该是 jmp 0x1f。 我也试过像这样的objdump:
objdump -D -b binary -mi386 -M intel foo
输出:
00000000 <.data>:<br>
0: 5c pop esp <br>
1: 78 33 js 0x36 <br>
3: 31 5c 78 65 xor DWORD PTR [eax+edi*2+0x65],ebx<br>
7: 62 0a bound ecx,QWORD PTR [edx]<br>
所以你能告诉我一些将原始十六进制代码反汇编成汇编语言的工具吗?
我也尝试过 gdb,但我想要更灵活的东西。
【问题讨论】:
-
字节 5c 78 65 5c 78 31 64 0a 是字符串
\xeb\x1d(以换行符结尾)的表示形式,这是您在键入echo '\xeb\x1d' >foo时得到的。你想反汇编字节 eb 1d,好像你误解了"\xeb\x1d"的意思。 -
另外注意
eb 1d是jmp .+0x1f,即跳转到的地址是相对于跳转指令所在地址的。根据这条指令反汇编的位置,绝对跳转目标会发生变化! -
@specializt 这正是反汇编的意思!将机器代码翻译回助记符。唯一涉及的猜测是指令开始的位置(以防 ISA 没有明确说明)以及对于某些 ISA,使用的是哪个指令集。
-
维基百科的文章同时试图深入和过于简单化。这行:“例如,x86 汇编程序在两个二进制代码之间任意选择,用于像 MOV AX,BX 这样简单的事情。如果原始代码使用其他选择,则原始代码根本无法在任何给定条件下复制时间点。” 是荒谬的。如果
MOV AX, BX有两种可能的编码,那么无论在十六进制转储中找到哪一种,都会反汇编为MOV AX, BX,这是原始指令! -
@CodyGray 维基百科的那篇文章需要一些认真的工作。他们实际上将文章过于复杂,以至于它实际上没有多大意义。即使是相对/绝对跳转的反汇编示例也没有任何意义。无论是绝对的还是相对的,都是编码的一部分。几乎就像不了解 x86 的人试图编写那样。
标签: assembly x86 disassembly shellcode