网站大量收购闲置独家精品文档,联系QQ:2885784924

Shellcode的原理及编写.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Shellcode的原理及编写

1.shellcode原理 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。 如下链接是shellcode编写的基础,仅供参考 ?/uidid-3506660.html 缓冲区溢出的shellcode很多了,这里重现下缓冲区溢出。 [cpp]?view plaincopy int?fun(char?*shellcode)?? {?? ????char?str[4]=;//这里定义4个字节?? ????strcpy(str,shellcode);//这两个shellcode如果超过4个字节,就会导致缓冲区溢出?? ????printf(%s,str);?? ????return?1;?? }?? int?main(int?argc,?char*?argv[])?? {?? ??char?str[]=aaaaaaaaaaaaaaaaaaa!;?? ??fun(str);?? ??return?0;?? }?? 如上程序,会导致缓冲区溢出。 程序运行后截图如下 如上可以看出来,异常偏移其实自己观实就是aaaa的Hex编码 因为调用函数的过程大致是 1:将参数从右到左压入堆栈 2:将下一条指令的地址压入堆栈 3:函数内部的临时变量申请 4:函数调用完成,退出 内存栈区从高到低 [参数][ebp][返回地址][函数内部变量空间] 如上程序,如果函数内部变量空间比较小,执行strcpy时候,源字符串比目标字符串长,就会覆盖函数返回地址,导致程序流程变化 如图 0048FE44前四个00是str申请的四个字节的并初始化为00,后面的48FF1800是函数的返回地址,再后面的411E4000是ebp,既调用函数的基址。 再往下执行strcpy函数后,可以看见aaaaaaaa覆盖了返回地址 如图 可以看见0018FF44地址后面的函数返回地址和ebp都被61填充了。 fun函数执行完后,返回调用fun函数地址时候,导致程序报错。 缓冲区溢出的简单讲解如上,这时候,如果我们把返回地址改成我们自己的函数地址,不就可以执行我们自己的程序了? 缓冲区溢出利用就是把返回地址改成我们自己的函数地址,上面的方法就是覆盖eip,既返回地址,还有一种方法是覆盖SHE,原理差不多。 了解了基本原理,下面可以编写利用的代码 缓冲区溢出,基本的使用方法是jmp esp,覆盖的eip指针是jmp esp的地址,利用的字符串结构如下 [正常的字符串][jmp esp的地址][执行的代码(shellcode)] 关于获取jmp esp的代码,可以自己写个程序,从系统中查找jmp esp代码0xFFE4。 下面开始编写shellcode以及调用实现 [cpp]?view plaincopy void?fun()?? {?? ????__asm?? ????{?? ?????mov?eax,?dword?ptr?fs:[0x30];?? ?????mov?eax,?dword?ptr?[eax+0xC];?? ?????mov?eax,?dword?ptr?[eax+0xC];?? ?????mov?eax,?dword?ptr?[eax];?? ?????mov?eax,?dword?ptr?[eax];?? ?????mov?eax,?dword?ptr?[eax+0x18];?? ?????mov?ebp,eax????????????????????????//Kernel.dll基址?? ?????mov?eax,dword?ptr?ss:[ebp+3CH]??????//?eax=PE首部?? ?????mov?edx,dword?ptr?ds:[eax+ebp+78H]??//?? ?????add?edx,ebp????????????????????????//?edx=引出表地址?? ?????mov?ecx,dword?ptr?ds:[edx+18H]??????//?ecx=导出函数个数,NumberOfFunctions?? ?????mov?ebx,dword?ptr?ds:[edx+20H]??????//??

您可能关注的文档

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档