20202426 2022-2023-2 《网络与系统攻防技术》实验一实验报告
目录
- 20202426 2022-2023-2 《网络与系统攻防技术》实验一实验报告
- 1.实验内容
- 1.1实践目标
- 1.2基础知识
- 2.实验过程
- 2.1实验环境
- 2.2直接修改程序机器指令,改变程序执行流程
- 2.2.1 反汇编
- 2.2.2 修改地址
- 2.2.3 实验结果
- 2.3 通过构造输入参数,造成BOF攻击,改变程序执行流
- 2.3.1 分析函数(foo getShell main)
- 2.3.2 确认哪几个字符会覆盖返回地址
- 2.3.3 确认字节序,构造输入字符串
- 2.3.4 实验结果
- 2.4 注入Shellcode并执行
- 2.4.1 准备工作-设置堆栈可执行和关闭地址随机化
- 2.4.2 构造要注入的payload
- 2.4.3 实验结果
- 2.5 结合nc模拟远程攻击
- 3.问题及解决方案
- 4.学习感悟、思考等
- 参考资料
1.实验内容
1.1实践目标
- 通过两种方法修改程序机器指令,改变程序执行流程
- 通过构造输入参数,造成BOF攻击,改变程序执行流
- 注入自己构造的Shellcode并成功运行这段Shellcode
1.2基础知识
- NOP, JNE, JE, JMP, CMP汇编指令的机器码
![img](https://img-community.csdnimg.cn/images/3ca48a2f2c8841829916080c798b53ad.png)
- 反汇编objdump
![img](https://img-community.csdnimg.cn/images/977a49c3f50a4edabcb8bb02642595eb.png)
- 十六进制编辑器
:%!xxd: 将显示模式切换为16进制模式
:%!xxd -r: 将16进制切换回ASCII码模式
2.实验过程
2.1实验环境
- Linux kali 6.1.0-kali5-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.12-1kali2 (2023-02-23) x86_64 GNU/Linux
2.2直接修改程序机器指令,改变程序执行流程
2.2.1 反汇编
objdump -d pwn20202426 | more
/getshell
![img](https://img-community.csdnimg.cn/images/5a5f053d63cd4771abfed312eece026c.png)
注:eip是指令寄存器,存储的是下一条指令的地址,本任务是80484ba。e8表示跳转,对应的是call,eip中的地址加上本条指令的偏移量,就可以跳转到call想要去的地址,本实验要求跳转到getshell,需要将d7改为c3。同时,先让当前eip地址入栈,以便于跳转结束后返回相应地址继续执行。
2.2.2 修改地址
本实验我使用16进制编辑器wxHexEditor修改:
apt-get install wxhexeditor
wxHexEditor
![img](https://img-community.csdnimg.cn/images/349004b53c7f4e0cab0bfa51ddf4b43a.png)
![img](https://img-community.csdnimg.cn/images/59a964c4e030463d9d86d9196c6c7920.png)
再反汇编看一下,call指令是否正确调用getShell
![img](https://img-community.csdnimg.cn/images/0a77edf3888641e99b486966b125cb47.png)
2.2.3 实验结果
![img](https://img-community.csdnimg.cn/images/ec244c1abd34485e9654838359cdb354.png)
2.3 通过构造输入参数,造成BOF攻击,改变程序执行流
2.3.1 分析函数(foo getShell main)
![img](https://img-community.csdnimg.cn/images/712c24b01a86438ba6043e6f7fd7e5ea.png)
由图可以看出,foo函数留出0x38给局部变量,留出0x1c给字符串。当读入字符串长度大于32字节时,字符串将覆盖到EIP。此时把“80484ba”覆盖为“804847d”,程序就可以跳转到getShell函数去执行。
2.3.2 确认哪几个字符会覆盖返回地址
![img](https://img-community.csdnimg.cn/images/8896ae823068486b9c9edf75c422dffb.png)
2.3.3 确认字节序,构造输入字符串
无法通过键盘输入\x7d\x84\x04\x08,因此先生成包括这样字符串的一个文件。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
接下来使用xxd查看文件内容
![img](https://img-community.csdnimg.cn/images/ae4005aca42d4f40976debb321abfebf.png)
2.3.4 实验结果
攻击成功,获得一个shell。
![img](https://img-community.csdnimg.cn/images/fba2832c3dc24576b41c94ec8823ccbc.png)
2.4 注入Shellcode并执行
2.4.1 准备工作-设置堆栈可执行和关闭地址随机化
![img](https://img-community.csdnimg.cn/images/70c4469fcc30454786c33b1907ce067f.png)
![img](https://img-community.csdnimg.cn/images/23ae1ee5bc9e4576b99a6b16fe8fa12e.png)
2.4.2 构造要注入的payload
打开两个终端,终端1运行pwn20202426-0,终端2进行gdb调试。
![img](https://img-community.csdnimg.cn/images/9aae1950ed8445e88f8dd0562e99bcbe.png)
![img](https://img-community.csdnimg.cn/images/32ab38f6867c40a88a544df78851d028.png)
注:构造字符串时,使用的方法是0xffffd02c+4=0xffffd030,小段模式下需要进行一步倒转,由此得到“\x30\xd0\xff\xff”
![img](https://img-community.csdnimg.cn/images/165bd0ba5a6d4648aaf94e6f01e637e8.png)
2.4.3 实验结果
![img](https://img-community.csdnimg.cn/images/ff96110dc8bd4343aa3ff3a92f6b7aee.png)
2.5 结合nc模拟远程攻击
主机1kali为靶机,ip地址为192.163.13.135
主机2ip地址为192.168.13.134,连接主机1并发送攻击载荷
![img](https://img-community.csdnimg.cn/images/728b349dc921462e8c2b95333b42c6b4.png)
由图可知,攻击成功。
3.问题及解决方案
- 问题1:运行文件时出现“zsh: permission denied” 报错
![img](https://img-community.csdnimg.cn/images/0b8072019f804d82b2e6e42babfb94ba.png)
- 问题1解决方案:授予权限:sudo chmod o+x ./pwn20202426
![img](https://img-community.csdnimg.cn/images/ec244c1abd34485e9654838359cdb354.png)
- 问题2:使用gdb时出现"zsh: 1:permission denied"报错
![img](https://img-community.csdnimg.cn/images/81c25bafec9642b2ab48a5fc6afa5df8.png)
- 问题2解决方案:修改权限:sudo chmod 777 pwn20202426-0
![img](https://img-community.csdnimg.cn/images/bc2cd3dbabc6459a9efccb16b180fe60.png)
![img](https://img-community.csdnimg.cn/images/9a9335010ed048da93ded7fb949e1cb2.png)
- 问题3:重启虚拟机后进行shellcode注入,未得到最终结果
![img](https://img-community.csdnimg.cn/images/93a66dccf43744aebd46ebdc86324790.png)
- 问题3解决方案:重启后需要重新设置堆栈可执行和关闭地址随机化
![img](https://img-community.csdnimg.cn/images/e16a9354907347b19cc9387ee7364fe5.png)
![img](https://img-community.csdnimg.cn/images/d5a8bbf779ba42428b072c39d69ca1a1.png)
4.学习感悟、思考等
本次实验是网络攻防课程的第一次实验,实验过程中用到了不少的知识,包括汇编、进制转换、堆栈的相关知识……,完成实验的过程也是一个学习新知识并且将新旧知识结合运用的过程,可以说在这个过程中解决问题的能力是得到了提高的,当然在这里也要感谢帮助我解答问题的同学们,当运行出正确结果的时候心里还是很激动的!说实话,这次实验我用了不少时间,有时候很快就要成功了,又会突然在一个点上出现问题,没有办法只能从某一个特定的地方重新来过,虽然有些操作要多重复几遍,但我仔细想来,觉得这也不是浪费时间,因为这个重复的过程其实可以深化对于一些知识的理解,在遇到一些常见的报错时,也能比较快的想出来应当怎么解决,因此我在这个过程中很真切地体会到了“熟能生巧”的含义。
当然了,应该清醒认识到的是,理论的学习是很重要的,只有理论学明白了,才能用其很好地指导实践。所以说在接下来的学习生活中,既要努力学好理论知识,又要积极行动,运用到实验当中去。此去任重道远,少年仍需努力!
参考资料