将shellcode反编译成c语言代码的两种方式

下述所用的工具包含:IDA pro,Dev C++
以下介绍两种方法
开始操作之前,需要知道的几个小前提

  • 一个可执行文件包含多个字段(field), text段是程序代码段,包含着要运行程序的指令。shellcode像你说的,转成汇编语言很容易,因为shellcode本质就是一段恶意的机器码——cpu指令
  • ****(reverse engineering)常用到的分析工具大体有两个:ollydbg、ida pro(当然如果是安全方面的话还会用到更多的工具比如immunity debugger等)前者是动态分析工具,如果不懂汇编的话就不管了。ida里有一个巨强大的功能,f5之后可以将一个函数反编译成c代码。
  • nop,就是空指令,运行这条指令,cpu不做任何事情。它的机器码是0x90

所以这里的思路就是:【c代码写一个程序,多了不用写就一个main函数就可以】——>【修改编译出程序的text段即修改代码段】——>【ida反汇编接着再反编译成c代码】
这里我用一个用cmd打开calc.exe的shellcode作为例子:
将shellcode反编译成c语言代码的两种方式
这是直接利用的c代码,效果图如下:
将shellcode反编译成c语言代码的两种方式
接着切入正题,我们需要在主函数返回之前插入我们的shellcode,所以说需要在return 0之前留空使得在保证原有程序大小的情况下插入shellcode。

这里就需要用nop来填充,对于dev中用汇编语言和在VC++中用汇编是不一样的,如下图:
将shellcode反编译成c语言代码的两种方式
总之要多写一些nop…
接着把程序拖到ida:
将shellcode反编译成c语言代码的两种方式
打开hex-view:
将shellcode反编译成c语言代码的两种方式
90是nop指令的机器码,所以直接在90这里改代码,按f2编辑,将shellcode填上。成果图:

之后就是在main函数上点f5,然后就完成了!这个方法比较复杂


(*(void(*)())&shellcode)();

这里涉及一句代码,函数指针指向shellcode字符串首地址,然后调用这个shellcode首地址的这个函数。虽然看起来挺复杂的,但换成汇编语言就一条指令:

call shellcode

所以就很简单了:
将shellcode反编译成c语言代码的两种方式
找到shellcode函数f5,完成。
以下是最后成果
将shellcode反编译成c语言代码的两种方式
将shellcode反编译成c语言代码的两种方式