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

时间:2017-06-27 13:41:19

标签: assembly x86 disassembly shellcode

是否有一些工具可以将原始六角形拆卸成装配说明?例如:假设我们根据this在线反汇编程序将 \ xeb \ x1d 反汇编为 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,但我想要更灵活的东西。

1 个答案:

答案 0 :(得分:3)

正如评论所建议的那样,您的问题是您已将字符串\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行业! ; - )