HW弹药库之红队作战⼿册
HW弹药库之红队作战⼿册 红⽅⼈员实战⼿册 声明 Author : By klion Date : 2020.2.15 寄语 : 愿 2020 后⾯的每⼀天都能⼀切安好 分享初衷 ⼀来, 旨在为 "攻击" / "防御"⽅ 提供更加全⾯实⽤的参考 还是那句⽼闲话 "未知攻焉知防", 所有单纯去说 "攻" 或者 "防" 的都是耍流氓, 攻守兼备才能把路越⾛越宽 ⼆来, 也是为秉承共享协作, 希望能为 红队 及 部分实战攻防研究⼈员 做出⾃⼰应有的贡献 个⼈⼀直坚信, 真正的价值来源于实实在在的奉献,与其天天到处嘴炮,不如静下⼼来多反思下⾃⼰,好好踏踏实实做 些对⼤家都有益的事 丑话说在前⾯ 严禁任何 个⼈/组织机构 利⽤以下相关技术去从事任何未经合法授权的 ⽹络⼊侵攻击破坏或者⿊产活动 严禁任何 个⼈/组织机构 以此来进⾏任何形式的 商业牟利 或 以下仅针对⽇常 "红队" 场景, 进⾏了⼀次相对全⾯完整的实战攻击利⽤技术提炼汇总 针对不同的渗透阶段,所可能会⽤到的⼀些技术都做了详尽梳理说明 (后⾯可能还会整理出对应的完整⼯具链,虽然那 不是最主要的) 由于红队不同于⼀般的渗透测试, 强调更多的是如何搞进去拿到相应机器权限 或者 实现某特定⽬的 ⽽不局限于你⼀定要在什么时间, ⽤什么技术 或者 必须通过什么途径去搞,相⽐传统渗透测试,红队则更趋于真实的0 码力 | 19 页 | 1.20 MB | 1 年前3钟阳红-Apache Ballista Introduction
第三届中国Rust开发者大会 Apache Ballista Introduction 钟阳红 (John Zhong) Software Engineer @ eBay nju_yaho@apache.org Agenda • Overview • Cluster Setup • SQL Execution • Data Cache • Future Apache Ballista0 码力 | 17 页 | 2.66 MB | 1 年前3Hello 算法 1.0.0b1 C++版
我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 66 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.cpp === /* 初始化队列 */ queuequeue; /* 元素入队 */ queue.push(1); queue.push(3); push(3); queue.push(2); queue.push(5); queue.push(4); /* 访问队首元素 */ int front = queue.front(); /* 元素出队 */ queue.pop(); /* 获取队列的长度 */ int size = queue.size(); /* 判断队列是否为空 */ bool empty = queue 0 码力 | 187 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b1 Java版
我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 67 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.java === /* 初始化队列 */ Queuequeue = new LinkedList<>(); /* 元素入队 */ offer(1); queue.offer(3); queue.offer(2); queue.offer(5); queue.offer(4); /* 访问队首元素 */ int peek = queue.peek(); /* 元素出队 */ int poll = queue.poll(); /* 获取队列的长度 */ int size = queue.size(); /* 判断队列是否为空 0 码力 | 186 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b1 Swift版
我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 5. 栈与队列 hello‑algo.com 68 Figure 5‑4. 队列的先入先出规则 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.swift === /* 初始化队列 */ // Swift 没有内置的队列类,可以把 Array 当作队列来使用 var queue: [Int] append(1) queue.append(3) queue.append(2) queue.append(5) queue.append(4) /* 访问队首元素 */ let peek = queue.first! /* 元素出队 */ // 使用 Array 模拟时 poll 的复杂度为 O(n) let pool = queue.removeFirst() /* 获取队列的长度0 码力 | 190 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b1 Python版
我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) que.append(1) que.append(3) que.append(2) que.append(5) que.append(4) """ 访问队首元素 """ front = que[0]; """ 元素出队 """ pop = que.popleft() """ 获取队列的长度 """ size = len(que) """ 判断队列是否为空 """ is_empty 队列需要一种可以在一端添加,并在另一端删除的数据结构,也可以使用链表或数组来实现。 基于链表的实现 我们将链表的「头结点」和「尾结点」分别看作是队首和队尾,并规定队尾只可添加结点,队首只可删除结 点。 5. 栈与队列 hello‑algo.com 63 Figure 5‑5. 基于链表实现队列的入队出队操作 以下是使用链表实现队列的示例代码。 # === File: linkedlist_queue.py ===0 码力 | 178 页 | 14.67 MB | 1 年前3Hello 算法 1.0.0b1 JavaScript版
我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 66 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.js === /* 初始化队列 */ // JavaScript 没有内置的队列,可以把 Array 当作队列来使用 const queue = queue.push(1); queue.push(3); queue.push(2); queue.push(5); queue.push(4); /* 访问队首元素 */ const peek = queue[0]; /* 元素出队 */ // 底层是数组,因此 shift() 方法的时间复杂度为 O(n) const poll = queue.shift(); /* 获取队列的长度0 码力 | 185 页 | 14.70 MB | 1 年前3Hello 算法 1.0.0b1 TypeScript 版
我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 65 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.ts === /* 初始化队列 */ // TypeScript 没有内置的队列,可以把 Array 当作队列来使用 const queue: number[] queue.push(1); queue.push(3); queue.push(2); queue.push(5); queue.push(4); /* 访问队首元素 */ const peek = queue[0]; /* 元素出队 */ // 底层是数组,因此 shift() 方法的时间复杂度为 O(n) const poll = queue.shift(); /* 获取队列的长度0 码力 | 186 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b1 Golang版
我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 5. 栈与队列 hello‑algo.com 68 Figure 5‑4. 队列的先入先出规则 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue_test.go === /* 初始化队列 */ // 在 Go 中,将 list 作为队列来使用 queue := list.New() /* PushBack(2) queue.PushBack(5) 5. 栈与队列 hello‑algo.com 69 queue.PushBack(4) /* 访问队首元素 */ peek := queue.Front() /* 元素出队 */ poll := queue.Front() queue.Remove(poll) /* 获取队列的长度 */ size := queue.Len()0 码力 | 190 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b2 C++版
out」数据操作规则的线性数据结构。顾名思义,队列模 拟的是排队现象,即外面的人不断加入队列尾部,而处于队列头部的人不断地离开。 我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 66 5.2.1. 队列常用操作 队列的常用操作 队列的常用操作见下表。需要注意,不同编程语言的方法名是不同的,在这里我们采用与栈相同的方法命名。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队 ?(1) peek() 访问队首元素 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.cpp === /* 初始化队列 */ queuequeue; push(1); queue.push(3); queue.push(2); queue.push(5); queue.push(4); /* 访问队首元素 */ int front = queue.front(); /* 元素出队 */ queue.pop(); /* 获取队列的长度 */ int size = queue.size(); /* 判断队列是否为空 */ bool 0 码力 | 197 页 | 15.72 MB | 1 年前3
共 326 条
- 1
- 2
- 3
- 4
- 5
- 6
- 33