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

Ris*_*att 6 x86 assembly disassembly shellcode

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

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]
Run Code Online (Sandbox Code Playgroud)

它应该是 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>
Run Code Online (Sandbox Code Playgroud)

所以你能告诉我一些将原始十六进制代码反汇编成汇编语言的工具吗?

我也尝试过 gdb,但我想要更灵活的东西。

Mic*_*tch 11

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

echo '\xeb\x1d' >foo
Run Code Online (Sandbox Code Playgroud)

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

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

  -n     do not output the trailing newline
  -e     enable interpretation of backslash escapes
Run Code Online (Sandbox Code Playgroud)

这可能有效:

echo -ne '\xeb\x1d' >foo
Run Code Online (Sandbox Code Playgroud)

使用NDISASM反汇编字节:

ndisasm -b32 foo
Run Code Online (Sandbox Code Playgroud)

现在应该产生:

00000000  EB1D              jmp short 0x1f
Run Code Online (Sandbox Code Playgroud)

在不使用中间文件(如foo)的情况下,您可以将ECHO输出通过管道传输NDISASM并以这种方式反汇编。这一行将采用一个 shell 代码字符串并输出反汇编:

echo -ne '\xeb\x1d' | ndisasm -b32 -
Run Code Online (Sandbox Code Playgroud)

-上到底是要告诉NDISASM从标准输入,而不是明确的文件拆机输入。

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