软件安全漏洞分析与发现 复习笔记

news2024/11/23 7:36:14

1 绪论

  • 本节无考点,仅供了解。





2 基础知识

考点: 汇编码理解和撰写,三种内存地址,不同的页管理方式。windows保护模式可能出题

  • 汇编算法的阅读理解
  • 给出汇编片段,理解其意思,输入->输出
  • 保护模式的内存寻址,现代OS的分页机制
  • x86机器码转换到汇编代码
  • windows内存管理分页模式推导,系统调用
  • ELF动态代码链接延迟绑定(逆向中综合),linux下的系统调用

2.1 处理器硬件架构基础

CPU按照字长可分为16位、32位和64位。


  • 汇编指令细节这里不展开了。下面是考试要求:

    这里给个示例代码:
section .data
    array dd 1, 2, 3, 4, 5  ; 定义一个数组,包含5个元素
    array_len equ 5         ; 定义数组长度

section .text
    global _start

_start:
    xor eax, eax            ; 将 eax 清零,用于存储累加和
    xor ecx, ecx            ; 将 ecx 清零,用于索引数组元素

sum_loop:
    cmp ecx, array_len      ; 比较索引是否达到数组长度
    jge end_loop            ; 如果索引 >= 数组长度,跳转到 end_loop

    add eax, [array + ecx*4] ; 将当前数组元素的值加到 eax
    inc ecx                 ; 索引加1
    jmp sum_loop            ; 跳回到 sum_loop 开始

end_loop:
    ; 这里可以添加其他代码,eax 中已经包含数组元素的累加和

    ; 退出程序
    mov eax, 1
    int 0x80

保护模式

  • 实模式没有内存保护机制,任何程序都可以访问系统内的任意内存地址。这导致一个程序可能会覆盖另一个程序的内存,从而导致系统崩溃。
    保护模式内存寻址
    逻辑地址转线性地址


    线性地址转物理地址

1.给定一个逻辑(虚拟)地址,尝试找到它的物理地址
在现代操作系统中,虚拟地址通过分页机制映射到物理地址。这个过程涉及页目录和页表。以下是一个示例过程:

虚拟地址结构(假设 32 位系统):

虚拟地址:0x12345678
页目录索引:虚拟地址的高 10 位(0x12345678 >> 22)
页表索引:虚拟地址的中间 10 位((0x12345678 >> 12) & 0x3FF)
页内偏移:虚拟地址的低 12 位(0x12345678 & 0xFFF)
查找过程:

使用页目录索引查找页目录,找到页表地址。
使用页表索引查找页表,找到物理页框地址。
物理地址 = 物理页框地址 + 页内偏移。

2.使用程序指令无法访问物理地址,那么操作系统是如何修改页目录表和页表
操作系统运行在高特权级别(内核模式),可以直接访问和修改页目录和页表。以下是一个示例过程:

特权级

2.2 反汇编与反编译基础

略。

2.3 Windows 操作系统基础




2.4 Linux 操作系统基础

略。

3 基础分析工具介绍

略。查ppt。

4 程序切片 (重点)

考点程序切片:集中出题。
1、控制流、数据流(可达性(参考ppt中的案例)、活跃变量)和程序依赖图(包括数据依赖和控制依赖)
2、现有的切片方法的应用:基于图可达性的静态切片计算
3、不考察数据流方程
4、最好提前看一下动态切片(方法二)的例子

  • 程序切片
    • 数据流和控制流(和污点分析结合),控制流图(如何画)和程序依赖图的区别
    • 可到达定义(算法,示例)、活性分析(理解概念)
    • 静态切片
      • 数据流方程(不考察,了解即可)
      • 图可达算法
    • 动态切片(往年静态切片为主,说不定会有动态)
      • 基于程序依赖的切片(几种优化方法,和可到达定义的结合)
      • 方法三后不用看




控制流分析



在这里插入图片描述

数据流分析

可到达定义分析(考察计算题)

  • 修正:上图中的语句2 的可到达语句不包括4。



定义集合
我们先确定每个语句的 Gen 和 Kill 集合:

Gen(0) = {0}
Kill(0) = {}
Gen(1) = {1}
Kill(1) = {}
Gen(2) = {2}
Kill(2) = {}
Gen(4) = {4}
Kill(4) = {1}
Gen(5) = {5}
Kill(5) = {0}
Gen(7) = {7}
Kill(7) = {1, 4}
Gen(8) = {8}
Kill(8) = {0, 5}
Gen(9) = {9}
Kill(9) = {2}
路径分析
接下来我们分析从入口到 [9] 的所有路径:

[0] -> [1] -> [2] -> [3] -> [4] -> [5] -> [9]
[0] -> [1] -> [2] -> [3] -> [6] -> [7] -> [8] -> [9]
在每个路径上,我们计算每个语句的 In 和 Out 集合。

路径1: [0] -> [1] -> [2] -> [3] -> [4] -> [5] -> [9]
In(0) = {}
Out(0) = Gen(0) = {0}
In(1) = Out(0) = {0}
Out(1) = Gen(1) ∪ (In(1) - Kill(1)) = {1} ∪ {0} = {0, 1}
In(2) = Out(1) = {0, 1}
Out(2) = Gen(2) ∪ (In(2) - Kill(2)) = {2} ∪ {0, 1} = {0, 1, 2}
In(3) = Out(2) = {0, 1, 2}
Out(3) = In(3) = {0, 1, 2}
In(4) = Out(3) = {0, 1, 2}
Out(4) = Gen(4) ∪ (In(4) - Kill(4)) = {4} ∪ {0, 2} = {0, 2, 4}
In(5) = Out(4) = {0, 2, 4}
Out(5) = Gen(5) ∪ (In(5) - Kill(5)) = {5} ∪ {2, 4} = {2, 4, 5}
In(9) = Out(5) = {2, 4, 5}

路径2: [0] -> [1] -> [2] -> [3] -> [6] -> [7] -> [8] -> [9]
In(0) = {}
Out(0) = Gen(0) = {0}
In(1) = Out(0) = {0}
Out(1) = Gen(1) ∪ (In(1) - Kill(1)) = {1} ∪ {0} = {0, 1}
In(2) = Out(1) = {0, 1}
Out(2) = Gen(2) ∪ (In(2) - Kill(2)) = {2} ∪ {0, 1} = {0, 1, 2}
In(3) = Out(2) = {0, 1, 2}
Out(3) = In(3) = {0, 1, 2}
In(6) = Out(3) = {0, 1, 2}
Out(6) = In(6) = {0, 1, 2}
In(7) = Out(6) = {0, 1, 2}
Out(7) = Gen(7) ∪ (In(7) - Kill(7)) = {7} ∪ {0, 2} = {0, 2, 7}
In(8) = Out(7) = {0, 2, 7}
Out(8) = Gen(8) ∪ (In(8) - Kill(8)) = {8} ∪ {7} = {7, 8}
In(9) = Out(8) = {7, 8}

对于路径1和路径2,我们得出In(9) = {2, 4, 5} ∪ {7, 8} = {2, 4, 5, 7, 8}
综合所有路径 Out(9) = Gen(9) ∪ (In(9) - Kill(9)) = {4, 5, 7, 8, 9}
[9] 处的可到达定义是 {4, 5, 7, 8, 9}。

Soundness(正确性):在数据流分析中,一个分析方法是“sound”的,意味着它不会遗漏任何可能影响程序行为的重要信息。在可到达定义分析中,soundness 意味着所有实际可能到达某点的定义都应该被包含在结果中。
False Positives(误报):在可到达定义分析中,误报指的是分析认为某个定义可达,但实际上在程序执行时不可能达到。一般来说,为了保持正确性,分析方法通常会倾向于保守,即宁愿包含更多的定义(可能的误报),也不遗漏任何实际可达的定义。
该方法是 sound 的,不会遗漏任何可能的定义。由于保守的性质,可能会存在误报,但这是为了确保正确性而做出的权衡。

活性分析(理解概念,不考计算)


程序依赖图



  • 实线:控制流依赖;虚线:数据流依赖;(叉掉的是ppt错了)
  • 新增的红线是数据依赖。
  • PDG 统一不考虑指向自己的依赖边。考试不考 for 循环,换为 while。

程序切片

基于数据流方程求解程序切片(不考)


基于图可达性的静态切片计算(考点)




动态切片





N=1,循环只有一次,所以切片不应该包含7。



第二轮根本执行不到7。红色边需要删除。


方法三之后不看。考试不考。

5 污点分析

考点:污点分析:会应用程序切片的可达性分析等技术。不会出难题,会基于汇编码。

污点传播






  • 用户级监控缺陷:无法跟踪内核指令。许多安全漏洞可能涉及内核态的操作,例如缓冲区溢出、权限提升攻击等。如果监控工具无法跟踪内核态,将无法全面检测和分析这些安全漏洞,可能导致潜在的安全威胁被忽视。






当内存指针本身是污点时:任意地址读、写




6 模糊测试(了解概念即可)

考点: 模糊测试:不会出综合题。重点是AFL。

  • 模糊测试
    • 基本原理
    • AFL基本原理,实现细节(插桩,覆盖率获取)
    • 算法优化(不涉及)











略。。

反馈式模糊测试 AFL





7 符号执行技术(重点)

考点 符号执行:重点考基本思路和方法,会用符号执行分析给定程序。注意动态/静态符号执行的区别,可能会考动态符号执行。混合符号执行的概念。常考题型:执行树。

  • 符号执行
    • 主要做什么
    • 路径表达式
    • 执行树(如何画,经常出现的题型)
    • 动态符号执行(基本概念),与静态的区别,给定输入能否走到指定分支

经典符号执行






路径条件





执行树



注:上图loc:13的z值ppt里有误,以后面的ppt为准。z值此时不需要更新。





过程内分析、过程间分析


动态符号执行(考概念)



并行符号执行(非重点)

选择符号执行(非重点)



8 网络协议逆向分析

考点:考基本概念,可能会结合污点传播(基于分隔符的划分方法)、程序切片(基于字段来源回溯的方法,动态后向数据切片)。最好熟悉这一章三个方法的流程。状态机不考分析题。

  • 网络协议逆向(基本概念)
    • 和污点,切片相关的内容,可能会进行结合
      • 基于分隔符(污点)
      • 基于消息处理指令(调用栈恢复)
      • 基于字段来源回溯(切片)
    • 字段关系识别
    • 密码算法逆向恢复(基本了解)

字段划分








基于分隔符的划分方法





基于消息处理指令上下文差异的划分方法





基于字段来源回溯的划分方法




基于切片的字段来源回溯




字段间关系识别




位置型字段





字段语义恢复








协议状态机恢复



略。

密码运算逆向恢复(了解即可)





9 软件漏洞机理分析

考点: 识别代码中可能触发漏洞的脆弱点。需要掌握ppt中给出的示例

  • 软件漏洞原理
    • 漏洞类型
    • 漏洞分析利用(综合)
    • 防护机制(基本概念)
  • 软件漏洞机理
    • 脆弱点分析
    • 路径分析


  • 漏洞内容略。

10 软件漏洞利用

考点: 会考漏洞利用。不会只靠各类漏洞的概念,需要在理解概念的基础上解题。

  • 软件漏洞利用
    • 最后综合题,ppt中实例
    • 堆中脱链的计算

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

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

相关文章

基于MBD的大飞机模块化广域协同研制

引言 借鉴国外航空企业先进经验,在国内,飞机型号的研制通常采用基于模型定义(MBD)的三维数模作为唯一的设计制造协同数据源,从而有效减少了设计和制造部门之间的模型沟通成本和重构所需的时间,也减少或避免…

(2)图像识别yolov5—识别图片视频等文件

目录 一、识别示例图片 二、识别视频 三、修改 detect.py 代码以输出物体坐标,更改识别方式 四、更改后的演示代码: 一、识别示例图片 在yolov5文件夹中,有两个示例图片,这里我们对示例图片进行识别。 打开命令行,进入到当前yolov5目录,通过运行下面的指令,然后对…

ARM32开发--RTC内置实时时钟

知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 学习目标 学习内容 RTC时钟介绍 RTC结构框图 RTC原理图 RTC时钟电源 RTC的配置流程 RTC时钟 开发流程 RTC初始化 时钟配置 时钟获取 BCD格式转化 完整代码 RTC时钟备份寄存器 总结 前言 在嵌入式…

小众宝藏工作软件大公开

嘿宝贝们!👋 今天要跟大家种草几款超实用但相对小众的工作软件,让你的工作效率直线上升,还能享受工作的乐趣哦!💼🎉 1️⃣ 亿可达 - 作为一款自动化工具,亿可达被誉为国内版的免费Z…

MT2094 甜品供应

思路&#xff1a; 贪心策略&#xff1a;手下按r进行从小到大排序。用小根堆存储甜品。如果堆顶甜品无法被当前手下满足&#xff0c;则将甜品放回堆中&#xff0c;看下一个手下能不能满足。 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N …

新渠道+1!TDengine Cloud 入驻 Azure Marketplace

近日&#xff0c;TDengine Cloud 正式入驻微软云 Marketplace&#xff0c;为全球更多用户带来全托管的时序数据处理服务。这一举措也丰富了 TDengine 的订阅渠道&#xff0c;为用户提供了极大的便捷性。现在&#xff0c;您可以通过微软云 Marketplace 轻松订阅并部署 TDengine …

基于51单片机公交车报站系统—显示时间温度

基于51单片机公交车报站系统 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用LCD12864播报站台&#xff0c;显示当前站台和下一站&#xff0c;当前时间和温度&#xff1b; 2.站台名为一号到四号&#xff0c;下行从一号到四号&#xff0c;…

力反馈设备的融入让虚拟装配训练更具沉浸感

随着科技的快速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经在各个领域得到了广泛应用。其中&#xff0c;虚拟装配训练作为虚拟制造的重要组成部分&#xff0c;对于提高装配效率、降低设计成本以及提升产品质量具有至关重要的作用。然而&#xff0c;传统的虚拟…

大模型排行榜出炉!第一名不是ChatGPT!

前言 现在科技圈什么最火&#xff1f;当属大模型。 如雨后春笋般冒出的大模型&#xff0c;每一个都在争做行业No.1&#xff0c;但你知道现在哪个大模型能力最强&#xff1f;哪个最受人喜欢吗&#xff1f; 近期&#xff0c;清华大学发布《SuperBench大模型综合能力评测报告》…

【启明智显分享】2D图形加速和JPEG解码如何实现高质量图形传输(以Model3A 7寸触摸屏为例)

自从1951年在旋风计算机上成功显示图形开始&#xff0c;人类致力于计算机处理图形的不发就从来没有停止过。随着技术的发展&#xff0c;人们对图形图像处理能力的期望也越来越高。计算机图形图像处理能力的提高与高运算能力的处理器和图像处理技术都有着紧密的联系。 今天&…

电脑意外出现user32.dll丢失的八种修复方法,有效解决user32.dll文件丢失

遇到与 user32.dll 相关的错误通常是因为该文件已损坏、丢失、或者与某些软件冲突。今天这篇文章寄给大家介绍八种修复user32.dll丢失的方法&#xff0c;下面是一步步的详细教程来解决这个问题。 1. 重新启动电脑 第一步总是最简单的&#xff1a;重新启动你的电脑。许多小问题…

MQTT通讯协议接入

1.MQTT协议概述 MQTT是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;常用于低带宽、不可靠网络环境下传输消息&#xff0c;适用于物联网设备之间的通信。 1.1 MQTT协议的组件 客户端&#xff08;Client&#xff09;&#xff1a;连接到MQTT代理服务器的设备&#xff…

怎么把flv格式转成mp4?教你四种简单好用的转换方法!

怎么把flv格式转成mp4&#xff1f;FLV文件格式&#xff0c;曾经以其独特的方式在视频传输领域崭露头角&#xff0c;如今却似乎被时代的洪流逐渐淹没。其新颖之处虽然为视频传输界带来了一抹亮色&#xff0c;但随之而来的挑战也不容忽视&#xff0c;首当其冲的便是兼容性问题。由…

HLS入门---流水灯闪烁

文章目录 1.HLS简介2.led闪烁实验2.1 函数撰写 1.HLS简介 HLS&#xff08;High-Level Synthesis&#xff0c;高级综合&#xff09;是一种将高级硬件描述语言&#xff08;如C/C&#xff09;转换为硬件描述语言&#xff08;如Verilog或VHDL&#xff09;的过程。这种技术允许设计…

推荐一款WPF绘图插件OxyPlot

开始 使用 NuGet 包管理器添加对 OxyPlot 的引用&#xff08;如果要使用预发布包&#xff0c;请参阅下面的详细信息&#xff09;向用户界面添加PlotView在代码中创建一个PlotModel绑定到你的属性PlotModelModelPlotView 例子 您可以在代码存储库的文件夹中找到示例。/Source/Ex…

录取查询小程序怎么制作?

招生老师往往需要花费大量的时间和精力去手动整理学生的录取信息&#xff0c;并一一通知学生。那时的录取查询系统&#xff0c;复杂而繁琐&#xff0c;要处理大量的数据&#xff0c;还要确保信息的准确无误和安全。经常为了发布录取结果&#xff0c;不得不加班到深夜&#xff0…

盲盒小程序 跨平台兼容性测试策略:打造无缝体验

在盲盒小程序的开发过程中&#xff0c;跨平台兼容性测试是确保应用在不同设备和操作系统上都能提供无缝体验的重要步骤。本文将探讨一些关键的跨平台兼容性测试策略&#xff0c;以助力开发者打造稳定、流畅的小程序。 一、明确测试目标 在进行跨平台兼容性测试之前&#xff0…

【数据结构 |集合框架、泛型】初始集合框架、时间(空间)复杂度、简单认识泛型

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

DDei在线设计器-属性编辑器

DDei-Core-属性编辑器 DDei-Core-属性编辑器插件包含了文本、大文本、数值、下拉、单选、勾选以及颜色等属性编辑。 图形和属性共同构成一个完整的定义&#xff0c;属性编辑器就是编辑属性值的控件。当选中图形实例时&#xff0c;属性面板就会展现当前实例的所有属性以及属性编…

JavaScript的面向对象思想及实现

文章目录 深入面向对象编程思想面向过程编程面向对象编程 构造函数原型数组扩展案例 constructor属性使用场景对象原型原型继承原型链 面向对象思想代码实现——模态框封装 深入面向对象 编程思想 面向过程编程 面向过程编程&#xff1a;面向过程就是分析出解决问题所需要的…