Javascript 中的原型链污染漏洞
才不是为了 bonus 而写的呢
哎嘛, +15%, 真香
Javascript 中的对象
在 Javascript 的世界中, “万物皆是对象”, 同时, JS 的对象和一些其它语言 (如 C++, Python) 中的对象存在一定的差异…
当我们创建一个对象的时候, 我们实际上在讨论什么?
我们用三种语言分别创建一个 “空” 的对象
class Foo{};int main(){ Foo foo;}
class Foo: passfoo = Foo()
var foo = {}
对于 C++ 来说, 一个空的对象, 或许就是一个空的对象: 如果学习过一定时间的 C++, 就会知道这样方法创建的对象仅仅有构造函数和析构函数, 而且是默认的构造函数和析构函数
这样干净的对象, 基本不存在可以利用的漏洞 (指对象层面的漏洞, 与 C++ 其他底层的漏洞, 如内存溢出等无关)
Python 就不一样了, 一个空的对象, 实际上隐藏着许多内置方法
当然, 这些方法的存在肯定会导致漏洞, 例如 CTF 中的沙箱逃逸 ...
文明 6 游戏机制
写在前面
搜集自网络, 部分经过测试
如无特殊说明, 所有数据均为标准速度 (500回合), 对应联机速度时要除以 2
公式
游戏进度相关
游戏进度 GP
定义变量 GP (Game Processing), 表示玩家的游戏的进度占全游戏流程的百分比, 是计算区域涨价, 项目涨价, 收割以及掠夺收益的前置系数
GP=max{T,C}GP = \max\{T,C\}
GP=max{T,C}
其中变量 T 表示玩家已经解锁的科技占科技树的比例, C 表示玩家已经解锁的市政占市政树的比例; GP 保留两位小数 (并非四舍五入, 而是舍弃小数点后第三位)
在文明 6 中, 科技树总量为 77, 市政树总量为 61
Eg 如果一个玩家解锁了 27 个科技和 23 个市政, 那么它的 GP 可以计算为
GP=max{27/77,23/61}=max{0.35,0.37}=0.37GP = \max\{27/77,23/61\}=\max\{0.35,0.37\}=0.37
GP=max{27/77,23/61}=max{0.35,0.37}=0.37
涨价系数
在文明 6 中, 区域和项目 ...
Computer System I Lab project 实验报告
写在前面
不知道什么原因, 也可能是因为博主能力有限, 很少找到 ZJU 计算机系统课的资料笔记, 而且由于该课程的 TA 生产力过高 (赞美 TA), 实验部分常常是一年一换, 因此想找到适合学习的资料更为难上加难
比如去年的实验内容应该是以 RV32I 为板子写 CPU, 今年就变成了 RV64I, 同时很多细节都不一样 (怒)
再此留下一份单周期 CPU 的实验报告, 鉴于一些别的原因, 源码暂不开源, 权当抛砖引玉
数据通路设计
根据设计要求, 数据通路图如下
由于我们设计的是单周期 CPU, 除内存模块, 寄存器模块 Reg[] 和 PC 外, 均可按照组合电路的设计模式设计
Memory
根据数据通路图, 数据走线不可避免地要与内存交流, 因此首先要分析 Memory 接口的结构
由于设计的是单周期 CPU, 所有的操作一定可以在一个时钟周期内完成, 不需要考虑很多, 只需要保持和 Memory 的数据信道的常开即可
需要考虑的是发送 / 接受的读写数据包格式 RrequestBit, RreplyBit, WrequestBit, WreplyBit; 这些格式在之后 ...
C++ | 完美转发
本文仍为草稿
万能引用
引入
在上一篇有关右值引用的文章的开头, 我们提到了 n 和 1 两个类型相同的表达式在某些地方表现的不同
除了在赋值语句中, 在重载函数调用推导的时候, 也会有不同的表现
考虑以下程序
void foo(int& x){ std::cout << "int& " << x << std::endl;}void foo(int&& x){ std::cout << "int&& " << x << std::endl;}int main(){ int a = 5; foo(a); // int& 5 foo(1); // int&& 1}
编译器符合预期的把作为左值的 a 和 1 分别推导到了符合的, 相对应的重载函数上去, 但是我们删去第二个 foo 所在的那一行代码
void foo( ...
RISC-V 初探
由于 markdown 对汇编的支持不好,本文代码块部分借用 python 的高亮规则
简介
RISC-V 是一个开源的精简指令集架构(ISA),也是 ZJU 信息安全专业计算机系统课程(2023级)指定使用的 ISA
顺序,分支和循环结构函数
汇编语言和高级语言的很大一个不同就是:在编写汇编程序的时候和硬件层面的关联是很紧密的,所写的每一条指令实际上是对应着 CPU 的某个特定操作(虽然实验课是用 SPIKE 模拟的),写的时候你可能会有真的在操作硬件的感觉
下面通过实例程序给出一些常用的 RISC-V 指令
学习一门语言最好的办法是写代码而不是读文档
由于 C 语言是众多高级语言中较为接近汇编的一种,因此对于习惯了高级语言的学习者来说,先试着从 C 到 RISC-V 是一种不错的学习模式
long long acc(long long a, long long b){ long long i, res; res = 0; for(i = a; i <= b; ++i){ res += i; } ...
Se:从零开始的C++游戏开发 | 日经记录贴
学习了那么那么多(其实也就一点点)的 C++ 和 OOP 的思想, 不来点有意思的实战有什么意思呢? 正巧最近在B站冲浪的时候刷到一个宝藏视频合集, 介绍了从零开始的C++游戏开发, 于是跃跃欲试…
前情提要: Re:从零开始的C++游戏开发 | 日经记录贴
视频链接: 从零开始的C++游戏开发
代码仓库: https://github.com/Z-Vanadium/Cpp-game-development
像素素材: https://anokolisa.itch.io/sidescroller-pixelart-sprites-asset-pack-forest-16x16
Day 8
在Re:从零开始的C++游戏开发中, 我们将所有代码都一股脑放在了main.cpp中, 即使通过封装和多态等方法加以组织, 依然在多次迭代后变成了史山. 所以, 我们首先要做的事情就是: 将这些内容分而治之
场景设计
为了将游戏内容分而治之, 我们需要将不同阶段的代码封装在不同的类中, 再把不同的类分布在不同的文件中, 以达到井然有序的文件组织结构.
上面所说的"不同阶段" ...
C++ | 回调函数
定义
回调函数(callback function) 被定义为"作为参数传递的函数", 或者用更加接地气的方式描述:
将函数 A 作为参数传递给函数 B, B 在执行的某一刻调用 A, 此时称 A 为回调函数
作用
回调提供了一种灵活的方式来扩展或自定义函数的行为, 需要在某些特定的时刻执行特定的动作, 但这些动作可能因情境而异. 通过使用回调, 可以允许其他代码决定何时以及如何响应
简单来说, 回调函数保证了调用者对被调用者的控制权, 是一种灵活的函数调用方式
应用场景
事件驱动
以 GUI 为例, 假如我们需要实现诸如"用户用鼠标点击按钮, 程序作出响应"的功能, "响应"就可以作为回调函数传递给按钮类
计时器
考虑需求"每 1min 执行函数一次", 我们可以先定义计时器类, 再将函数作为回调函数传递给计时器的实例化, 避免了我们只能通过继承的方式创建大量无用的计时器类的子类
错误处理
实现
作为一种机制, 回调函数在很多语言中都有实现方法
C
在 C 中一般使用函数指针实现回调函数, 考 ...
Re:从零开始的C++游戏开发 | 日经记录贴
学习了那么那么多(其实也就一点点)的 C++ 和 OOP 的思想, 不来点有意思的实战有什么意思呢? 正巧最近在B站冲浪的时候刷到一个宝藏视频合集, 介绍了从零开始的C++游戏开发, 于是跃跃欲试…
视频链接: 从零开始的C++游戏开发
代码仓库: https://github.com/Z-Vanadium/Cpp-game-development
版本发布:
V1.0: https://vanadium.lanzoum.com/iQQVy1w15k8d 密码:6gji
Day 1
环境搭建
VSCode + OpenGL 太难配置了, 浪费一个下午, 最终决定用懒人 IDE – VS, VS 赛高!!!
IDE: Visual Studio Community 2022
图形库: EasyX
位图编辑: Picxel Studio
VS
安装时仅需勾选"使用C++的桌面开发"
EasyX
安装最新版本, 打开后为自己将要使用的 VS C++ 安装 EasyX
环境测试
打开 VS, 创建空 C++ 项目命名为 demo, 新建 main.cpp, ...
FDS | 常见排序算法实现 C 语言版
无聊写了下 C 语言实现的各种排序算法
预处理
由于 C 语言没有多态, 只考虑对某个类型排序, 以 int 类型为例子
#include<stdio.h>#include<stdlib.h>#define ElemType int
辅助函数
定义谓词函数和交换函数
// 表示第一个参数大于第二个参数int greater(const ElemType* x, const ElemType* y){ return *x > *y;}// 表示第一个参数小于第二个参数int less(const ElemType* x, const ElemType* y){ return greater(y, x);}void swap(ElemType* x, ElemType* y){ ElemType tmp; tmp = *x, *x = *y, *y = tmp;}
函数接口
统一接口格式如下
void sort(ElemType* base, size_t n, int (*p ...
C++ | Formatting & Print Library
本文仍为草稿
原文地址: https://hackingcpp.com/cpp/libs/fmt.html
前言
Formatting & Print 库(fmt库)是一个可以高效且安全地将 C 标准输入输出库转化为 C++ 输入输出流的现代 C++ 库(C++20 出现, C++23 加入标准库)
相比之前废拉不堪的输入输出函数, Formatting & Print 库有如下特性:
更快
更便捷
类型安全
由于目前大多数编译器并没有实现对 C++23 中 print 库的支持, 我们依然使用 C++20 的 fmt 库演示格式化与输出操作
PTA 的 C++ 编译器为 gcc 11.4.0, 只支持到 C++17, 所以在 PTA 平台上用不了这么好用的东西
前期准备
由于 fmt 库不存在于 C++20 的标准库中, 所以我们要手动引入
VSCode with mingw
首先, 删除.vscode配置文件, 在 IDE 界面按下 F5 查看 VSCode 使用的编译器的路径
在任意空文件夹下运行下面的 git 命令获取 fmt 库
g ...