如何将shellcode反汇编成汇编指令?

How to disassemble a shellcode into assembly instruction?

是否有一些工具可以将原始十六进制反汇编成汇编指令?例如:假设我们有 \xeb\x1d 根据 this 在线反汇编器反汇编成 jmp 0x1f。那么有没有一些离线工具?我试过 ndisasm 它没有给我正确的输出。

ndisam -b32 foo 给我:

输出:

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,但我想要更灵活的东西。

正如评论所建议的那样,您的问题是您已将字符串 \xeb\x1d 作为 ASCII 输出到您试图反汇编的文件中。您可能做过类似的事情:

echo '\xeb\x1d' >foo

您可以这样做,但您需要告诉 echo 解释转义字符 \。这可以通过 -e 选项来完成。

你会希望它不使用 -n 选项在末尾附加换行符。这记录在 ECHO 手册页中:

  -n     do not output the trailing newline
  -e     enable interpretation of backslash escapes

这可能有效:

echo -ne '\xeb\x1d' >foo

使用NDISASM反汇编字节:

ndisasm -b32 foo

现在应该产生:

00000000  EB1D              jmp short 0x1f

不使用中间文件(如foo)你可以通过管道将ECHO输出到NDISASM并以这种方式反汇编.此行将采用 shell 代码字符串并输出反汇编:

echo -ne '\xeb\x1d' | ndisasm -b32 -

末尾的 - 需要告诉 NDISASM 从标准输入而不是显式文件反汇编输入。

我们现在已经彻底改变了 IT 行业! ;-)