Home avatar

Wings

「笔记」软件工程

第一章

软件是程序, 数据及相关文档的完整集合

文档 + 程序

  • ⽂档是软件质的部分
  • 程序是⽂档代码化的表现形式
  1. 运行时提供程序
  2. 程序能够处理数据
  3. 程序能够按照预定的商业逻辑运行
  4. 描述程序功能需求以及程序如何操作的文档

软件开发和维护中遇到的问题

  • 怎样满足对软件日益增长的需求 (如何开发软件)
  • 如何维护数量不断膨胀的已有软件 (如何维护)

说 nm 呢

产生原因:

两个方面, 1) 软件本身的特点 2) 软件开发维护的方法

  • 客观: 软件本身
    • 逻辑部件
    • 规模庞大
  • 主观: 不正确的方法:
    • 忽视需求分析
    • 忽视文档
    • 轻视维护

解决方法:

  1. 组织管理
  2. 工程项目管理方法
  3. 技术措施
  4. 软件开发技术与方法
  5. 软件工具

软件工程是知道计算机软件开发和维护的一门工程学科. 采用工程的概念, 原理, 技术和方法来开发维护软件.

  1. 问题定义: 问题性质报告, 工程目标和规模报告, 对用户访问调查, 得到双方满意的文档
  2. 可行性研究: 导出系统的逻辑模型, 数据流程图, 在此基础上更准确, 更具体确定工程规模和目标, 更准确估计系统成本和效益.
  3. 需求分析: 和用户配合, 交流, 得出经过用户确认的系统逻辑模型, 通常用数据流程图, 数据字典和简要的算法表示
  4. 总体设计: 如何解决问题, 低成本完成最少的工作, 中成本完成一些附加功能, 高成本完成用户还可能希望有的功能
  5. 详细设计: 把任务具体化, 设计出详细的程序说明, 通常是 HIPO 图 或 PDL 语言
  6. 编码和单元测试: 写程序, 并测试每个模块
  7. 综合测试: 通过各种测试使软件达到要求
    1. 集成测试: 更具软件结构, 把模块按策略装配, 测试 (联调的意思)
    2. 验收测试: 按规格说明书的规定, 对目标系统进行验收
  8. 软件维护: 改正性, 适应性, 完善性, 预防性维护

瀑布模型:

2023 D^3CTF MISC d3craft

第一次给这么大型的比赛出题, 有点慌qaq. 本题仅有 3 支队伍解出, 比预期少一点. 可能是大佬们在看其他更有挑战性的题目, 对游戏不感兴趣吧. 其中来自满分冰美式的师傅以非预期的解法薄纱此题. 下面我会详细分析这题的预期解法, 以及非预期的做法, 欢迎各位对 Minecraft Hack 感兴趣的师傅一起交流!

2023 XCTF Final Pwn haslang

一些废话: 比赛时先去看了 V8, 瞄了眼这题没什么想法后又跑去做 misc 了 (逃). 当时以为是什么打解释器的难题就先放了去做 shellgame, 结果啥都没做出来, 喜提零贡献 (逃).

V8 Pwn Basics 1: JSObject

JS 有这几种基本数据类型: Undefined, Null, Boolean, String, Symbol, Number, Object. 数组和函数实际上是 Object. 显然, 最复杂的一种类型就是 对象Object. 本文主要介绍 Object 在 V8 中的表示.

Object 的本质是一组有序的 属性property, 类似于有序字典, 即键值对有序集合. 键可以是非负整数, 也可以是字符串. 键为数字的属性称为 编号属性numbered property, 为字符串的称为 命名属性named property. 比如一个 object = {'x': 5, 1: 6};. 引用这个属性可以用 . 或者 [], 如 object.x, object[1]. 每个属性都有一系列 属性特性property attributes, 它描述了属性的状态, 比如 object.x 的值, 它是否可写, 可枚举等等.

每当创建一个对象时, V8 会在堆上分配一个 JSObject (C++ class), 来表示这个对象:

I I n n - - O O b b P j j r E e e o l L c c p e e t t M e m n a r e g P P p t n t r r i t h o o e s p p s e e r r t t y y # # 1 n
  • Map: 指向 HiddenClass 的指针
  • Properties: 指向包含 命名属性 的对象的指针
  • Elements: 指向包含 编号属性 的对象的指针
  • In-Object Properties: 指向对象初始化时定义的 命名属性 的指针

其中, Map 是用来确定一个 Object 的形状的, Proerties 和 Elements 都是 Object 中的属性. Properties 和 Elements 独立存储, 为两个 FixedArray (V8 定义的 C++ class), 编号属性一般也叫 元素Element, 他是可以用整数下标来访问的, 一般也就存储在连续的空间中. 而由于动态的原因, 命名属性难以使用固定的下标进行检索. V8 使用 Map Transition 的机制来动态表示命名属性.