1、独立的存在,无需任何文件格式的包装
2、内存中运行,无需固定指定的宿主进程
生成shellcode的一种方法是找到编写的程序的文件偏移,用winhex打开程序,找到文件偏移,复制十六进制保存为文件。
用ida打开我们的文件,在函数名称栏我们可以看到有很多sub_开头的函数,这些全是vs给我们自动添加的代码,这些代码对我们编写shellcode有很大干扰,我们要尽量将其清除
1、修改程序入口点
2、关闭缓冲区安全检查
代码生成中的运行库debug版本要设置成为MTD,release版本要修改为MT
我们使用PEiD查看程序的节区,发现有代码段,数据段,资源段。
rsrc为默认添加的清单数据
将连接器中的清单文件的生成清单选择否,可以实现去除资源段的效果
将链接器中的调试里的生成调试信息选为否,可以关闭数据段(vs2008成功,2015失败),不影响生成shellcode
shellcode中不可以使用api函数,应为每个应用程序加载的dll位置不同,也应该避免全局变量的使用
确保已加载所使用API的动态链接库
windows每个程序在内部都会对ntdll,dll、kernel32.dll、kernelbase.dll
我们获得了kernel32.dll的地址就相当于得到了LoadLibrary(“kernel32.dll”)的返回值,有了这个返回值就相当于有了GetProcAddress函数的第一个参数
fs:[30]代表是PEB结构,PEB结构的0c位置是模块信息
每个系统的程序第三个模块加载的都是kernel32.dll
获得GetProcAddress地址