简单地讲,ShellCode就是一段01二进制的机器码,试图利用软件中的漏洞完成自己想做的事情。ShellCode的编写需要考虑和顾及的东西很多,这里先写一个适合新手的范例。
*需要的预备知识:
1.汇编语言(尤其要清楚了解函数是如何调用的)
2.PE文件格式(可参考《Windows PE 权威指南》一书)
3.一点点WinAPI函数
*使用的工具软件:
1.MASM32
2.Stud_PE
3.OllyDBG
一、用C语言写出弹出计算器的代码
1 LoadLibrary("kernel32.dll"); 2 WinExec("calc.exe", 5); 3 ExitProcess(0);
二、找到这些函数函数的虚拟内存地址
WinExec()和ExitProcess()都是kernel32.dll中的函数,使用Stud_PE查看kernel32.dll的相关信息
这里我们注意到kernel32.dll的映像基址为0x7C800000,也就是说系统在加载kernel32.dll的时候,会将其加载到虚拟内存为0x7C800000的位置。
接着查看kernel32.dll中的函数的偏移地址,偏移地址+映像基址=函数在虚拟内存中的地址
可以看到WinExec()函数的偏移地址为0x000623AD,所以WinExec()在虚拟内存中的地址为0x7C8623AD,同理得到ExitProcess()的地址为0x7C81CAFA。
事实上一般的PE文件都会加载kernel32.dll,user32.dll,ntdll.dll等动态链接库,所以我们不必要调用LoadLibrary("kernel32.dll"),不过当我们的ShellCode需要使用到其他动态链接库的时候,如ws2_32.dll等,LoadLibrary()函数是必须的,故也将其地址找到:0x7C801D7B。
注:在实际的ShellCode编写中,函数的地址与操作系统的版本有关,故需要使用其他的技巧,这里只是写一个简单的范例。
三、将C语言转化为汇编语言
使用MASM编写编译
1 .386 2 .model flat,stdcall 3 option casemap:none 4 5 include windows.inc 6 include us