我查看了x86_64bit机器的指令集并尝试匹配,但遗憾的是没有得到任何解决方案。我不想要确切的答案,只是询问有人知道解决这个问题的步骤,或者是否有任何工具可以解决它。
感谢您的时间
答案 0 :(得分:3)
首先,将该字节流写入文件。使用它比使用字符串更容易。有很多方法可以解决我刚才首先考虑的特定问题(可能非常不理想):
echo -n`echi ba000000004885ff74144889fa8b073b02480f4cd7488b7f084885ff75ef4889d0c3 | sed's /(..)/ \\ x \ 1 / g'`> f.bin
现在您可以使用各种工具来反汇编文件:
e.g。
ndisasm -b 64 f.bin
-b
选择64位默认模式
或
objdump -D -b binary -m i386:x86-64:intel f.bin
-D
表示反汇编所有部分,-b binary
指定文件是二进制文件(而不是目标文件),-m i386:x86-64:intel
选择64位x86-64解码英特尔语法。
您还可以查看opcode map来解码流。我们开始时看到BA
与B8+r
匹配MOV r16/32/64 imm16/32/64
。由于该指令没有REX
前缀,因此它是r32 imm32
版本。在这种情况下是r == 0xBA-0xB8 == 2
,查看“32/64位ModR / M字节”表,我们看到r
是edx
。紧接着在接下来的4个字节中(在这种情况下它是0)。换言之,该指令解码为:
mov edx, 0
下一条指令以REX.W
前缀(48
)开头,后跟TEST r/m16/32/64 r16/32/64
(85
)。您应该能够自己解码跟随ModR
字节。
最后提示:您可能希望查看objdump
s --adjust-vma
命令行选项。
答案 1 :(得分:0)
使用gdb。您可以在序列中定义数据字节,然后使用反汇编操作。如果您需要扩展这个答案,请告诉我。
修改即可。因为这是家庭作业,你应该手工完成。
sandpile.org上的解码表非常好。单击“一个字节操作码”开始。
您的机器语言是:
ba000000004885ff74144889fa8b073b02480f4cd7488b7f084885ff75ef4889d0c3
所以你的第一个字节是ba
。在表中查找。它说MOV rDX,Iv (r10,Iv)
。没有REX前缀,所以它是进入edx。要了解I
和v
,请转到http://www.sandpile.org/x86/opc_enc.htm。在这里,我们看到大写I
表示立即,小写v
是单词或双字或qword。当您进入edx时,您有一个dword,所以请查看ba
之后的下一个8字节。它们都是零,因此您的第一条指令是mov edx, 0
。痛苦,是的,但它是功课。如果您还没有涵盖这些解码表的使用,那么请使用user786653答案中提供的漂亮技术。