逆向及BOF基础实践 html
20145316 许心远 shell
1、缓冲区溢出基础知识 编程
缓冲区溢出是一种很是广泛、很是危险的漏洞,在各类操做系统、应用软件中普遍存在。利用缓冲区溢出攻击,能够致使程序运行失败、系统宕机、从新启动等后果。更为严重的是,能够利用它执行非受权指令,甚至能够取得系统特权,进而进行各类非法操做。第一个缓冲区溢出攻击--Morris蠕虫,发生在1988年,由罗伯特,莫里斯(R ob。rtMorris)制造,它曾形成全世界6000多台网络服务器瘫痪。 vim
计算机程序通常都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存通常称做缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间以外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的状况是程序检查数据长度并不容许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区自己的容量,而致使数据溢出到被分配空间以外的内存空间,使得溢出的数据覆盖了其余内存空间的数据。 服务器
缓冲区溢出中,最为危险的是堆栈溢出,由于入侵者能够利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃致使拒绝服务,另一种就是跳转而且执行一段恶意代码,好比获得shell,而后随心所欲。 网络
(本次实验就是跳转到shell)。 编辑器
缓冲区溢出攻击的目的在于扰乱具备某些特权运行的程序的功能,这样可使得攻击者取得程序的控制权,若是该程序具备足够的权限,那么整个主机就被控制了。通常而言,攻击者攻击root程序,而后执行相似"exec(sh)"的执行代码来得到root权限的shell。为了达到这个目的,攻击者必须达到以下的两个目标: 函数
1. 在程序的地址空间里安排适当的代码。 工具
2. 经过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。 编码
(本次实验是基于目标二的实现来完成的。)
2、实践:经过构造输入参数,形成BOF攻击,改变程序执行流程
(一)反汇编,了解程序的基本功能
1.先创建一个以本身学号姓名命名的我的文件夹,将pwn1放入
2.pwn1是可执行文件,直接运行便可,知道功能是回显输入
但输入过长时出现"segmentation fault"提示,即非法占用内存(缓冲区溢出)
3.用指令objdump反汇编pwn1,管道后的more表示按页显示,按空格键便可翻页
4.简单分析下反编译的代码
Main函数:注意main函数的第四行call 8048491<foo>,是跳转到foo函数的意思,这一行指令是本次实践的关键
Foo函数:原本应该跳转到的函数,功能是回显输出,但存在缓冲区溢出漏洞。系统只预留了?(不会看)字节的缓冲区,超出部分会形成溢出,咱们的目标是覆盖返回地址
Getshell函数:本实验咱们目标要触发的就是这个"捣乱"的函数——恶意代码,它能够实现shell外壳的功能
(二)确认输入字符串哪几个字符会覆盖到返回地址
1.gdb调试
2.尝试输入1111111122222222333333334444444455555555,观察各个寄存器数值
3.注意eip寄存器中的值为0x35353535,即5555的ASCII码。你们知道eip寄存器的功能就是保存程序下一步所要执行指令的地址,此处咱们能够看出原本应返回到foo函数的返回地址已被"5555"覆盖
4.将原本"55555555"的地方替换为"12345678"更方便看出是字符串中哪几个字符实现了覆盖,根据eip中的ASCII码0x34333231发现是"1234"。
(三)确认用什么值来覆盖返回地址
1.如今咱们经过反汇编已知返回地址(getshell地址)应为0804847d,但并不肯定要这台机器采用的字节序是大端仍是小端,因此没法肯定输入数据应为\x08\x04\x84\x7d仍是\x7d\x84\x04\x08。
2.在输入字符串的地方0x804849d处设置断点,查其eip 0x804849d 0x804849d
3.再对比以前 eip 0x34333231 0x34333231 (4321对应ASCII码为34333231)因此得出正确应输入 11111111222222223333333344444444\x7d\x84\x04\x08
(四)构造输入字符串
1.没法经过键盘输入\x7d\x84\x04\x08这样的16进制值(foo函数的输入是字符串形式,不是数值)
2.因此要先生成包括这样字符串的一个文件。\x0a表示回车,若是没有的话,在程序运行时就须要手工按一下回车键。
3.使用输出重定向">"将perl生成的字符串存储到文件input中;而后用16进制查看指令xxd来查看字符串是否如愿重定向到input文件中
(五)完成
将input的输入,经过管道符"|",做为pwn1的输入。由于个人pwn1文件在学号姓名文件夹和home文件夹里各放了一份,因此两个文件夹中各执行shell的ls指令结果不一样。
3、实践:直接修改程序机器指令,改变程序执行流程
(一)制做副本,观察反汇编代码。
1.制做一个pw1执行文件的副本,pw2,对其进行反汇编,观察<main>、<foo>、<getshell>的核心代码,找出可供改变程序执行流程的"空子"
2.先看main函数反汇编的第4行,"call 8048491 "是汇编指令,是说这条指令将调用位于地址8048491处的foo函数;其对应机器指令为"e8 d7ffffff",e8即跳转之意。原本正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但一解释e8这条指令呢,CPU就会转而执行 "EIP + d7ffffff"这个位置的指令。"d7ffffff"是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值(foo函数调用入口),
3.main函数调用foo,对应机器指令为" e8 d7ffffff",那咱们想让它调用getShell,只要修改"d7ffffff"为,"getShell-80484ba"对应的补码就行。用Windows计算器,直接 47d-4ba就能获得补码,是c3ffffff。
4.下面咱们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff
(二)直接在vim编辑器中修改(须要知道各类编辑操做口令)
改正以后的汇编码,e8d7ffffff变为e8c3ffffff
(三)在图形化的16进制编程器中完成修改
1.安装wxhexeditor
root@KaliYL:~# apt-get install wxhexeditor
root@KaliYL:~# wxHexEditor
2.在菜单栏的file中选择open打开pwn2文件
3.利用查找工具等完成e8d7到e8c3的替换
(四)完成
下面咱们再反汇编一下,看看call指令是否正确调用getshell,结果是正确的,完成。
4、实践:shellcode注入
下一篇日志:shellcode入门 http://www.cnblogs.com/xxy745214935/p/6477120.html