1.实验内容
本周课程内容为缓冲区溢出和shellcode:
2.实验过程
(1)直接修改程序机器指令,改变程序执行流程
①首先根据网上教程安装好kali虚拟机,更改主机名为heshan;下载目标文件pwn1,将pwn1文件放入共享文件夹并在VMware中设置共享以便使用,并将其重命名为pwn20222418。
②然后运行可执行文件./pwn20222418,再对文件进行反汇编找到
③修改可执行文件pwn20222418,将其中的call指令的目标地址由d7ffffff变为c3ffffff:
终端输入vi pwn20222418 ,打开文件后为乱码,输入:%!xxd将显示模式切换为16进制模式,然后查找修改内容/e8 d7并修改d7为c3。
(查找修改内容/e8 d7)
(修改完成,转换16进制为原格式)
④再对文件进行反汇编,此时call指令跳转到getShell函数:
运行下改后的代码,会得到shell提示符#:
(2)通过构造输入参数,造成BOF攻击,改变程序执行流
首先根据提示安装gdb,使用sudo apt update和sudo apt install gdb命令安装gdb。
①反汇编,了解程序的基本功能:
在程序调用时,会读入字符串,但系统只预留了28字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址。根据反汇编结果,程序正常执行时,call指令会调用foo函数,并在堆栈中压入返回地址0x80484ba。
②确认输入字符串哪几个字符会覆盖到返回地址:
如果输入字符串111111111111111111111111111234567890123,那 3456 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn20222418,就会运行getShell。
③确认用什么值来覆盖返回地址:
将
1234
替换为getShell
的地址0x0804847d
,根据字节序,需要输入11111111222222223333333344444444\x7d\x84\x04\x08。④构造输入字符串
由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件,使用16进制查看指令xxd查看input文件的内容是否如预期。
然后将input的输入,通过管道符“|”,作为pwn1的输入,成功调用shellcode。
(3)注入Shellcode并执行
①准备一段Shellcode
我使用指导里给出的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
②准备工作:修改设置
这一步需要安装execstack,使用sudo apt-get upgrade命令无法安装execstack,所以需要在外部官网进行安装,官网链接为:http://ftp.de.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_amd64.deb,安装好后移入共享文件夹,使用sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb命令进行解压。
安装好后开始修改设置:
③构造要输入的payload
构造
shellcode
的输入,并注入这段攻击buf;其中x1x2x3x4
是占位符,后续将替换为注入shellcode
的地址,即foo
函数中返回地址的位置,这个地址需要我们接下来通过gdb
分析找到。再开另外一个终端,用gdb来调试这个进程。
首先找到pwn的进程号是3869。
启动gdb调试这个进程:
通过设置断点,来查看注入buf的内存地址,找到01020304,就是返回地址的位置。shellcode就挨着,所以地址是 0xffdc3040
重新构造shellcode的输入并验证:
尝试调用shellcode:
本来应该成功结束了,可恶!!!
但很遗憾,失败了,此后我重新尝试了几次,都在最后这一步出现同样的错误,我不信邪拿室友的电脑重做了一次,居然一下就成功了!(以下是成功截图)
截止写报告我还没改成功自己电脑的实验,眼看快提交了才用了室友的电脑尝试[对手指],我想之后再继续看看是哪里的问题。
3.问题及解决方案
- 问题1:共享文件夹在虚拟机再次启动时共享失败
- 问题1解决方案:查找资料发现如果选择一直启用共享文件夹,再次开启虚拟机时需要再次挂载,也可以选择每次开机时重新共享
- 问题2:找不到execstack命令
- 问题2解决方案:上网搜索发现需要下载,且需要到外部官网下载放入文件夹,你是在Windows主机下载压缩包后,通过共享文件夹用虚拟机解压安装。
- 问题3:最后调用shellcode失败报错
- 问题3解决方案:换了个虚拟机从头开始做,成功了;正在根据报错查找资料尝试解决。
4.学习感悟、思考等
实验开始之前,我对实验内容和任务可以说是一点也不明白,刚开始做的过程中也是只能按照实验指导的步骤一步步来,但不出所料这样单纯的模仿出了不少问题,比如多按了enter不会共享文件看不懂报错等。在这个过程中我不断和同学交流、查找资料并对比一些网络上的信息,不断尝试才最终完成实验,在这之后我对本次缓冲区溢出实验的原理和三种方法的过程有了理解和吸收,给其他人讲的时候也能说出一二,这既让我觉得神奇有趣也让我有了一些成就感和继续学习的更多动力。
参考资料
(主要参考资料)
https://blog.csdn.net/qq_24484317/article/details/129532811?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522B570DD9E-72CE-43F5-AE66-55C3BA54673A%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=B570DD9E-72CE-43F5-AE66-55C3BA54673A&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-129532811-null-null.142v100pc_search_result_base6&utm_term=kali%20linux%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187
https://blog.csdn.net/Libra1313/article/details/135628331
https://zhuanlan.zhihu.com/p/111035992
https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x11_MAL_逆向与Bof基础.md#4-注入shellcode并执行
https://blog.csdn.net/zonei123/article/details/105500483