异步
异步异步编程:概念、原理与实践异步编程是一种允许程序在执行耗时操作时不阻塞主线程的编程模式,它是现代软件开发中处理并发和提高响应性的核心技术。以下从多个维度深入解析异步编程:
一、异步编程的核心概念1. 同步 vs 异步
同步编程:代码按顺序执行,前一个任务完成后才会执行下一个。例如:
12data = download_file("url") # 阻塞等待下载完成process_data(data) # 下载完成后处理
问题:IO 操作(如网络请求、文件读写)会阻塞主线程,导致界面卡顿或系统响应变慢。
异步编程:耗时任务启动后立即返回,主线程继续执行其他操作,任务完成后通过回调、事件等机制通知程序。例如:
12download_file("url", callback=process_data) # 启动下载后立即返回# 主线程继续执行其他任务
优势:充分利用 CPU 资源,提高系统吞吐量和用户体验。
2. 异步编程的关键术语
回调函数(Callback):任务完成后执行的函数。
Promise/Fu ...
V8-通用利用链
V8-通用利用链首先需要明确的是,通过 v8 漏洞,我们需要达成什么样的目的?
一般在做 CTF 的时候,往往希望让远程执行 system(“/bin/sh”) 或者 execve(“/bin/sh”,0,0) 又或者 ORW ,除了最后一个外,往往一般是希望能够做到远程命令执行,所以一般通过 v8 漏洞也希望能够做到这一点。一般来说,我们希望能往里面写入shellcode,毕竟栈溢出之类的操作在 v8 下似乎不太可能完成。
WASM的利用既然要写 shellcode,就需要保证内存中存在可读可写可执行的内存段了。在没有特殊需求的情况下,程序不可能特地开辟一块这样的内存段供用户使用,但在如今支持 WASM(WebAssembly) 的浏览器版本中,一般都需要开辟一块这样的内存用以执行汇编指令,回想上一节给出的测试代码:
123456789%SystemBreak();var wasmCode = new Uint8Array([0,97,115,109,1,0,0,0,1,133,128,128,128,0,1,96,0,1,127,3,130, ...
CVE-2020-6537分析报告
CVE-2020-6537分析报告一、漏洞详情84.0.4147.105 之前的 Google Chrome 中的 V8 类型混淆允许远程攻击者通过精心设计的 HTML 页面在沙盒内执行任意代码。
二、影响范围Google Chrome 84.0.4147.105 之前
三、前置知识TorqueTorque(简称 TQ)是 V8 JavaScript 引擎内部使用的领域特定语言(DSL),专门用于编写 V8 的高性能内置功能。.tq 文件就是包含 Torque 代码的文件。
大多数用Torque编写的源代码都写入到V8存储库 src/builtins 目录下,文件扩展名为 .tq 。V8的堆分配类的Torque定义与它们的C++定义一起出现在 .tq 文件中,其名称与 src/objects 中相应的C文件相同。实际的Torque编译器可以在 src/torque 下找到。Torque 功能的测试在 test/torque 、 test/cctest/torque 和 test/unittests/torque 目录下进行。
为了让您体验一下这种语言,让我们编写一个V8内置程序来打印 ...
Torque函数解析
Torque函数解析valuesArray.elements 在 V8 引擎中的含义这行代码涉及 V8 内部的数组存储机制,是理解 JavaScript 数组在底层如何实现的关键。我来解释其工作原理:
1. valuesArray 是什么?
类型:JSArray 对象(V8 对 JavaScript 数组的内部表示)。
作用:存储 Promise.all() 或 Promise.allSettled() 的最终结果数组。
示例
1234Promise.all([Promise.resolve(1), Promise.resolve(2)]).then(values => { // values 就是这里的 valuesArray // values: [1, 2]});
2. elements 属性的含义
类型:FixedArray 或 NumberDictionary。
作用:存储数组的实际元素。V8 会根据数组的密集度动态选择存储方式:
密集数组(如 [1, 2, 3]):使用 FixedArray(固定长度的连续内存)。
稀疏数组(如 [, ...
chrom-V8环境搭建
chrom-V8环境搭建环境编译chrome 里面的 JavaScript 解释器称为v8。
我们下载的源码称为V8,而V8经过编译之后得到的可执行文件为 d8。根据编译时选择的不同,编译出来的 d8 分为 debug版本 和 release版本,一般把这两个版本都编译出来。
下载源码由于需要去谷歌的网站上下载源码,所以需要保证虚拟机能够走代理。我这里直接设置允许局域网连接,将虚拟机设置为NAT,那么就可以上梯子。
随后,依次安装
depot_tools
这个工具是用来得到v8源码的:
12git clone https://chromium.googlesource.com/chromium/tools/depot_tools.gitecho "export PATH=$(pwd)/depot_tools:${PATH}" >> ~/.bashrc
ninja
这个工具是用来编译v8的:
123git clone https://github.com/ninja-build/ninja.gitcd ninja && ...
shadow文件分析
shadow文件分析前言在分析路由器的时候需要用到默认的密码是什么,但是我无法从网上知道,于是我想办法通过shadow去分析密码出来
shadow文件当前的Linux系统出于安全性考虑,etc/passwd 文件中并没有存储Linux用户的密码信息,而是转移到了/etc/shadow文件下,又称为“影子文件”。该文件只有root用户才能read权限,其他用户无权查看,使密码泄露风险降低。同时shadow文件中存储的密码采用SHA512散列加密,相比较原始的MD5,加密等级更高。
shadow文件密码存储格式:
id
Method
1
MD5
2a
Blowfish(not in mainline glibc;added in some Linux distribution)
5
SHA-256(since glibc 2.7)
6
SHA-512(since glibc 2.7)
salt是长度1-16字符的随机数,随机数的引入增大了破解难度
encrypted是最终的密文,即通过加密算法和salt(盐参)计算的最终结果
示例:
1$6 ...
面试算法学习
面试算法学习前言为了应对腾讯的笔试,简单学习一些算法来应对吧,也是好久没有写代码了,一些基本的代码如何用都忘了,简单复习一下
算法题洗牌算法
对52张牌洗牌,要求尽量洗乱,而且原牌不能在原位置上重复
洗牌算法是常见的随机问题:将1-52张扑克牌重新洗牌。
Fisher–Yates随机置乱算法也被称做高纳德置乱算法,通俗说就是生成一个有限集合的随机排列。Fisher-Yates随机置乱算法是无偏的,所以每个排列都是等可能的,当前使用的Fisher-Yates随机置乱算法是相当有效的,需要的时间正比于要随机置乱的数,不需要额为的存储空间开销。
12345678910111213import randomdef shuffle(buf): length = len(buf) print(length) for i in range(length): number = random.randint(i,51); buf[i],buf[number] = buf[number],buf[i]buf=[]for i in range(1,53): ...
静态链接
静态链接空间与地址分配
对于多个输入目标文件,链接器如何将它们的各个段合并到输出文件?或者说,输出文件中的空间如何分配给输入文件?
按序叠加一个最简单的方法就是将输入的目标文件按照次序叠加起来,也就是将各个目标文件依次合并。但这样做会造成一个问题,在有很多输入文件的情况下,输出文件将会有很多零散的段。就会有很多零散的段,因为每个段是有一定的地址和空间对齐要求,这样会造成内存空间大量的内部碎片。所以这不是一个好办法。
相似段合并一个更加实际的办法是将相同性质的段合并到一起,比如将所有输入文件的“.text”合并到一起,其他段也是一样的。
”链接器为目标文件分配地址和空间“这句话中的“地址和空间”其实有两个含义:第一个是在输出的可执行文件中的空间;第二个是在装载后的虚拟地址中的虚拟地址空间。 事实上,我们在这里谈到的空间分配只关注于虚拟地址空间的分配。因为这关系到链接器后面的关于地址计算的步骤,而可执行文件本身的空间分配与链接过程关系不大。
现在链接器空间分配的策略基本上都是采用相似段合并的方法。使用这种方法的链接器一般都采用一种叫 两步链接的方法。也就是说整个链接过程分两步:
第一步 ...
零宽度字符水印
零宽度字符水印零宽度字符简介零宽度字符是一些不可见的,不可打印的字符。它们存在于页面中主要用于调整字符的显示格式。
常见的零宽度字符及它们的unicode码和原本用途:
零宽度空格符 (zero-width space) U+200B : 用于较长单词的换行分隔
零宽度非断空格符 (zero-width no-break space) U+FEFF : 用于阻止特定位置的换行分隔
零宽度连字符 (zero-width joiner) U+200D : 用于阿拉伯文与印度语系等文字中,使不会发生连字的字符间产生连字效果
零宽度断字符 (zero-width non-joiner) U+200C : 用于阿拉伯文,德文,印度语系等文字中,阻止会发生连字的字符间的连字效果
左至右符 (left-to-right mark) U+200E : 用于在混合文字方向的多种语言文本中(例:混合左至右书写的英语与右至左书写的希伯来语),规定排版文字书写方向为左至右
右至左符 (right-to-left mark) U+200F : 用于在混合文字方向的多种语言文本中,规定排版文字书写方向为右至左
...
零信任网关
零信任网关前言讲零信任,要先从VPN说起。
在电影《指环王》的圣盔谷守卫战中,洛汗军民依托城堡坚固的防御工事,一次次打退敌军的攻击,却因敌人利用了一条通向城内的下水道将厚重的城墙炸穿,攻守形势瞬间逆转。
VPN作为企业远程办公的常用工具,如今也如同那个致命的下水道一样,反倒为黑客突破层层边界防御提供了“捷径”。
把VPN比作“小区门卫”,安全破绽有多少?如果把VPN网关比作小区门卫,在外网环境下通过VPN访问公司内网应用,好比小甲要去位于该小区的小乙家玩,门卫只需对小甲身份和来意简单盘问即可放他进门。
VPN网关IP和连接端口须映射到互联网,能被黑客扫描到并发起攻击。这就好比欲对小乙家图谋不轨的法外狂徒张三,可以轻易地获取到小乙家的地址。面对小区门卫,张三使点小伎俩,即可骗过门卫,进入小区。比方说:
由于VPN默认“信任”所有内部访问流量,因此一旦VPN网关被攻破,就没有更进一步的安全措施阻止攻击到达企业数字资产。也就是说,只要张三骗过门卫进入小区,就可以:
除了盗窃和破坏,张三还能叫来一大群地痞流氓,围住小区门口不让进出,勒索小区住户打钱……
若小区门卫懂得零信任,张三还能 ...