Hi I’m zeroy

Welcome to my blog!

Templates

@zeroy.site 读入输出挂 inline int read(){ char c=getchar(); int num=0,fl=1; while(c<48 || c>57){if(c=='-')fl=-1;c=getchar();} while(c>=48 && c<=57){num=(num<<1)+(num<<3)+(c^48);c=getchar();} return num*fl; } inline void write(int x){ if(x<0){ putchar('-'); x=-x; } if(x>9)write(x/10); putchar(x%10+'0'); } 正向表 int tot=0,h[M]; struct edge{ int nxt; int to,cost; }G[3*M]; void add(int a,int b,int c){ G[++tot]=(edge){h[a],b,c}; h[a]=tot; } //图论题存图用的 //遍历: for(int i=h[x];i;i=G[i].nxt){ int u=G[i].to,v=G[i].cost; //... } 基础数据结构 树状数组 void Add(int x,int d){ while(x<=n){ C[x]+=d; x+=(x&-x); } } int Sum(int x){ int res=0; while(x){ res+=C[x]; x-=(x&-x); } return res; } //在线单点加值,查询前缀和,单次操作复杂度均为O(logn) ST表 预处理...

May 20, 2022 · zeroy

攻防世界reverse练习区WP

0x00. simple-unpack 使用exeinfope脱壳,拖进IDA shift+F12搜索字符串。 0x01. logmein 反编译得到如下代码: void __fastcall __noreturn main(int a1, char **a2, char **a3) { size_t v3; // rsi int i; // [rsp+3Ch] [rbp-54h] char s[36]; // [rsp+40h] [rbp-50h] BYREF int v6; // [rsp+64h] [rbp-2Ch] __int64 v7; // [rsp+68h] [rbp-28h] char v8[28]; // [rsp+70h] [rbp-20h] BYREF int v9; // [rsp+8Ch] [rbp-4h] v9 = 0; strcpy(v8, ":\"AL_RT^L*.?+6/46"); v7 = 0x65626D61726168LL; v6 = 7; printf("Welcome to the RC3 secure password guesser....

April 19, 2022 · zeroy

RSA算法详解

前置知识:欧拉定理 进阶知识:Miller Rabin算法(用于生成大素数),蒙哥马利算法(用于加快大数相乘再取模运算) 引入 历史上常规的密码加解密算法的流程如下: 假设甲要给乙发送数据,则需要甲通过一定的加密规则将数据加密,传送给乙,乙再通过一定的解密规则进行解密。 由于可靠性高的密码算法都要公开自己的加解密算法,因此,在数据传输的过程中,密钥的传输成了一个大难题。 因此RSA算法将密钥分为公钥和私钥两个部分,公钥任何人都可以获取到,而私钥只有数据接收方知道,接下来我们看看RSA加解密算法的运作流程。 算法流程 选定两个素数\(p\),\(q\),令\(n=pq,\phi{(n)}=(p-1)(q-1)\) 选取一个公钥\(e\),满足\(1<e<\phi{(n)}\),且\(e\)与\(\phi{(n)}\)互质 生成私钥 \(d\),满足\(ed\equiv1(mod\ \phi{(n)})\) 假设要发送的信息为\(m\),则加解密规则成立: $$ m^e\equiv c\pmod{n}\\ c^d\equiv m\pmod{n} $$ 可靠性分析 考虑甲向乙发送一串数据,乙只需要向甲传送\(n\)和\(e\),甲就可以将加密完成的\(c\)发还给乙,由乙来进行解密操作。 考虑第三方攻击者,只可能截获\(n\),\(e\),\(c\),若要获取私钥\(d\),则必须计算得\(n\)分解成的\(p\),\(q\)两数。 而大质数的因式分解所需要的运算量是非常恐怖的。因此,当选定的\(n\)很大时,RSA算法几乎不可能被破解。 总而言之:RSA利用的是,大数容易相乘,难以分解的特性,使得算法可靠。 代码实现 #RSA加解密算法实现 @copyright zeroy p=1000000007 q=998244353 n=p*q phi_n=(p-1)*(q-1) E=65537 def qkpow(a,b): ans=1 while b>0: if b%2==1: ans=ans*a%n a=a*a%n b=b//2 return ans def exgcd(a,b): if b==0: return 1,0,a else: x,y,q=exgcd(b,a%b) x,y=y,(x-(a//b)*y) return x,y,q # E**D=1(mod phi_n) def calcD(): x,y,q=exgcd(E,phi_n) return x+phi_n D=calcD() # C=m**E%n def encode(m): c=qkpow(m,E) return c # ans=c**D%n def decode(c): return qkpow(c,D) def main(): c=encode(234234) ans=decode(c) print(ans) main() 正确性证明 RSA算法过程以及正确性证明 - 简书 (jianshu....

March 31, 2022 · zeroy

写在Apple2022年春季发布会之后

Apple 活动 - 2022 年 3 月 - Apple (中国大陆) 2022年3月9日凌晨2点,我以当天的工图考试考爆为代价(虽然不看也会考爆),看了这场发布会。 本场发布会苹果发布了新iPhone SE,iPad Air5,Mac Studio和Studio Display四款新品,iPhone13系列新增了配色。时长为1个小时的发布会内容不可谓不多,但万众期待的新MacBook Air和M2芯片没有发布。 近两年Apple发布会给人的奇怪感觉 近两年关于Apple不再创新的论断已经几乎没有了,毫无疑问,Apple在个人电子设备领域不断地做出了一次又一次重大突破。遥记2020年Apple秋季发布会上登场的M1芯片,全新的架构为新设备带来了相当于老设备好几倍的性能,同时凭借ARM架构天然的省电特性,让仅重1.29kg的MacBook Air达到了惊人的18小时续航(我自己这台丐中丐版本8+256G版本MacBook Air实测开PD虚拟机打galgame一个多小时仅掉电7%,这可是经过了2层转译啊!)。 去年10月份发布的M1 Pro和M1 Max芯片进一步加大了芯片组的规模,达到了相当于X86平台i7-11800H+RTX3060 laptop组合的性能,同时功耗大大降低,使得搭载这颗芯片的MacBook Pro实现了不插电与插电相同性能。 M1 Pro 与 M1 Max 隆重登场:Apple 迄今打造的最强芯片 - Apple (中国大陆) 同时由于高通摆烂和华为被制裁,Apple的老本行手机芯片与安卓阵营的差距进一步拉大,用苹果的原话说:“他们甚至还在追赶我们两年前发布的芯片!“ Apple在芯片上的巨大优势,使得近两年的发布会让人有种奇妙的感觉,”除了芯片没活儿了!“ 仔细想想,确实是这样。 iPhone SE用6年前的外观换最新的A15芯片,新品! iPad Air5从A14升级到桌面级的M1芯片,性能翻倍!不能说提升不大吧?新品! Studio Display拿A13芯片当摄像头和音响驱动单元。最新的安卓旗舰手机打原神帧率甚至不如一个显示器(doge)。苹果仿佛在说:”我们知道显示器塞A13很奢侈,但没办法,这是我们在生产的性能最低的芯片。“(doge)你高通一届一届换了多少soc了,有用吗?换汤不换药啊!再下去要输显示器了,脸都不要了 务实成了Apple发布会的主旋律。MacBook Pro14英寸和16英寸的版本外观梦回PowerPC时代,接口数大大增加。Apple的Pro系列产品终于开始真正”Pro“,完全以实用为导向,在保证实用的基础上,做到尽量高水平的工业设计。 这些因素的共同作用导致现在Apple发布会的观感从没有创新到东西很好,但完全可预测。 狠角色M1 Ultra Mac Studio 和 Studio Display 登场 |bilibili M1 Ultra | 颠覆游戏规则 |bilibili Mac Studio - Apple (中国大陆) 两个M1 Max粘在一起。 看起来很简单粗暴,但是有很多问题可以深究。...

March 10, 2022 · zeroy

[PWN.0x01]canary|partial overwrite|ret2libc

canary绕过 什么是canary? canary是一种防止栈溢出的保护机制,可以在终端中使用checksec命令检查ELF文件是否开启了canary保护。 是否开启canary的编译选项: gcc -o test test.c // 默认情况下,不开启Canary保护 gcc -fno-stack-protector -o test test.c //禁用栈保护 gcc -fstack-protector -o test test.c //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码 gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码 在开启了canary的情况下,程序会在栈底额外存储一个值,并在函数return的时候检查这个值是否发生变动,从而判断程序是否发生了栈溢出,可以大大提高程序运行的安全性。 如何绕过canary? canary本身有个防意外输出的机制,由于printf %s函数以\x00为输出结束的标志,因此为了防止canary下面的合法数据段被合法写入的情况下,canary被printf函数意外输出,所以在小端序程序中,canary的最低位字节一定为\x00,因此可以进行partial overwrite,即部分覆盖。在写完合法的区域之后,溢出写入一个字节的数据把canary末尾的\x00覆盖掉,这样之后的printf函数就会顺带着泄露canary的值。 ret2libc 概述 在较为基础的pwn题中一般都有一个显性的system函数和/bin/sh字符串供选手调用。 如果这两者都不显性存在,就可以使用ret2libc方法。 这种方法主要针对**动态链接(dynamic linking)**的程序,程序运行时会调用 libc.so (程序被装载时,动态链接器会将程序所有所需的动态链接库加载至进程空间,libc.so 就是其中最基本的一个)。 libc.so 是 linux 下 C 语言库中的运行库glibc 的动态链接版,并且 libc.so 中包含了大量的可以利用的函数,包括 system() 、execve() 等系统级函数,我们可以通过找到这些函数在内存中的地址覆盖掉返回地址来获得当前进程的控制权。通常情况下,我们会选择执行 system("/bin/sh") 来打开 shell。 工作重心转向获取libc.so加载进内存的可利用的函数的地址。 什么是动态链接? 深入理解动态链接 - 简书 (jianshu.com) 深入理解GOT表和PLT表 - 知乎 (zhihu.com) got表和plt表在程序执行过程中的作用 - 云+社区 - 腾讯云 (tencent....

March 7, 2022 · zeroy

[PWN.0x00]函数调用栈结构与栈迁移

前置知识:汇编语言(第4版)前半本 注:本文适用于32位程序,示意图中上为高地址区,下为低地址区。若方框中字体为蓝色表示此处内存的地址,为黑色表示此处内存存储的值。示意图中leave均表示leave|ret 函数调用栈的基本结构 一些寄存器的作用: EIP:存储着下一条指令的地址,每执行一条指令,该寄存器变化一次。 EBP:存储着当前函数栈底的地址,通过将其与偏移地址相加减获取变量的地址。 ESP:始终指向栈顶。 在进入一个函数时,会执行如下操作。 push eip+4 push ebp mov ebp,esp 在执行完退出时,会执行如下操作。 mov esp,ebp pop ebp pop eip 即leave和ret。 整个过程描述起来就是,先将函数执行完成之后应当去执行的语句(eip+4)和主程序的的基址(ebp)压入栈中,然后再将ebp指向栈底。在函数执行完之后,再进行一遍上述过程的逆过程。 函数调用栈工作时的结构如下图: 其中val0地址处存储主程序传入的参数,如果有多个传入参数,它们将按照从右到左的顺序被push入栈中,val1~3为函数申请的局部变量。它们将按照申请的顺序被放入栈中。举例来讲,形如: void func(int a){ int b,c; char s[10]; } 这样的函数,a将被存入val0,b将被存入val1,c将被存入val2,s将被存入val3。 考虑最基础的栈溢出题目,由于程序将按照地址从低到高的顺序存储字符串变量,所以当s的数据由选手掌控且溢出空间足够大时,s将溢出到val2,val3,甚至旧ebp,eip的位置上。所以选手就可以控制旧ebp,eip处的内容,实现劫持程序返回,让程序执行恶意代码的目的。 但有时候,选手能掌控的数据量很有限,不足以支持我们完成过于复杂的劫持指令,对于这种情况,其中一种解题方法就是栈迁移。 栈迁移 栈迁移的核心思想是劫持当前函数已经压入栈中的eip段,将其内容改为一次leave,同时修改旧ebp段,借助旧ebp为跳板,实现对esp的控制,进而在下一次ret中,修改eip的值,实现目的。 也就是说,要构造栈中数据如图所示: 至于为什么要-4,后面模拟的过程中读者自能体会。 好了,现在当前函数已经执行完了,程序将自行执行一次leave和ret。执行之后的结果如图: 然后程序会执行eip指向的地址的命令,即再执行一次leave,ret,执行后栈的情况如图: 这样我们就完成了借助ebp为跳板,将esp指向目标eip的位置,控制程序在最后一次ret(即pop eip)的时候,将eip赋值成了我们想让它执行的函数的地址。 例题:ciscn_2019_s_4 BUUCTF在线评测 (buuoj.cn) 所谓“从零开始的Pwner生活”第一题,差点直接给我整劝退。 惯例checksec,只开了NX。 ida分析得到: int vul() { char buf[40]; // [esp+0h] [ebp-28h] BYREF memset(buf, 0, 0x20u); read(0, buf, 0x30u); printf("Hello, %s\n", buf); read(0, buf, 0x30u); return printf("Hello, %s\n", buf); } 发现只有8个字节的溢出空间,不足以支持一次完整的ROP,但是可以读两次,且第一次读入有输出,因此可以利用第一次读入来泄露ebp(注:这里的ebp指的是vul函数的ebp,即read函数栈帧中的旧ebp)。...

March 5, 2022 · zeroy

基于go-cqhttp的机器人NoyaBot

前言 2月14情人节过于孤独,于是萌生了写个qqbot玩的想法。 概述 项目地址:zeroy0410/NoyaBot (github.com) 配置完go-cqhttp的基本信息之后,就可以用它的api来操纵bot的账号进行各种操作,同时go-cqhttp会转发接收到的信息到指定端口。只需要在本地搭建一个服务器对收到的信息进行一定规则的回复即可。 我使用了Python-Flask作为项目的框架。 机器人功能(截止2022/3/3) 闲聊 回答指定的问题 设定回答问题的概率 数学计算 计算能用一行字符串表示的Sympy库格式的数据 一言 翻译 /teach A|B #当输入为A时以B来回答 /let talk_enable (True or False) #是否在群内开启闲聊 /let talk_probability 一个浮点数 #闲聊时接话的概率 /ask A #问话就会回答(无视上面两条指令的限制) /calc sympy库格式的一条算式 #不要尝试计算复杂度过高的式子,计算时间过长会阻塞进程 /hito 参数# 一言参数参考https://hitokoto.cn/ /trans 内容|from|to #如trans Hello World!|en|zh 英译中 注意事项 数学计算功能使用了eval函数让python能够解析输入的代码,我过滤掉了大部分常用的注入语句,但仍有被注入的风险。

March 3, 2022 · zeroy

高等数学(上) 不定积分 总结

高等数学上册(微积分)必背公式总结 - 知乎 (zhihu.com) 导数: $$ \begin{align} &[\cos(\omega x+\varphi)]^{(n)}=\omega^n\cos(\omega x+\frac{n\pi}{2}+\varphi)\\ &[\sin(\omega x+\varphi)]^{(n)}=\omega^n\sin(\omega x+\frac{n\pi}{2}+\varphi)\\ \end{align} $$ 重难点公式: $$ \begin{align} &\int\frac{1}{a^2+x^2}dx=\frac{1}{a}arctan\frac{x}{a}+C\\ &\int\frac{1}{a^2-x^2}dx=\frac{1}{2a}ln|\frac{a+x}{a-x}|+C\\ &\int\frac{1}{\sqrt{a^2-x^2}}dx=arcsin\frac{x}{a}+C\\ &\int\frac{1}{\sqrt{x^2\pm a^2}}dx=ln|x+\sqrt{x^2\pm a^2}|+C\\ &\int{tan\ x}dx=-ln|cos\ x|+C\\ &\int{cot\ x}dx=ln|sin\ x|+C\\ &\int{csc\ x}dx=ln|csc\ x-cot\ x|+C\\ &\int{sec\ x}dx=ln|sec\ x+tan\ x|+C\\ &\int{sec^2\ x}dx=tan\ x+C\\ &\int{csc^2\ x}dx=-cot\ x+C\\ &\int{sec\ x*tan\ x}dx=sec\ x+C\\ &\int{csc\ x*cot\ x}dx=-csc\ x+C\\ \end{align} $$ 凑系数,拆项: $$ \int{\frac{x}{(2x+3)^2}}dx=\frac{1}{2}\int{\frac{2x+3-3}{(2x+3)^2}}dx=\frac{1}{2}\int{\frac{2x+3}{(2x+3)^2}}dx-\frac{1}{2}\int\frac{3}{(2x+3)^2}dx\ … $$ 分子包含多项的,直接无法求解可以拆项求。 常见的配凑: $$ \begin{align} &xe^x:\\ &\int\frac{1+x}{x(xe^x+1)}dx=\int\frac{(1+x)e^x}{xe^x(xe^x+1)}dx=\int\frac{1}{xe^x(xe^x+1)}d(xe^x)\overset{t=xe^x}=\int\frac{1}{t(t+1)}dt\\ &xlnx:\\ &\int\frac{(1+lnx)dx}{1+x^2ln^2x}=\int\frac{1}{1+(xlnx)^2}d(xlnx)\\ &\frac{1}{\sqrt{x}}:\\ &\int\frac{1}{\sqrt{x(x+4)}}dx=2\int\frac{1}{2\sqrt{x}\sqrt{x+4}}dx=2\int\frac{1}{\sqrt{4+\sqrt{x}^2}}d{\sqrt{x}}\\ &e^x:\\ &\int f(e^x){\rm dx}=\int\frac{f(e^x)}{e^x}{\rm de^x}=\int\frac{f(t)}{t}{\rm dt} \end{align} $$...

February 16, 2022 · zeroy

Golang|Gin Web development for Beginners

自带的net/http库的使用 http库提供了HTTP服务的用户端和服务端的实现。 官方文档 Go语言基础之net/http | 李文周的博客 (liwenzhou.com) 示例代码 监听本地端口,在浏览器输出Hello World字符串。 func sayHello(w http.ResponseWriter,r *http.Request){ //ResponseWriter为服务端返回的内容 fmt.Fprintln(w, "Hello World!") } func main(){ http.HandleFunc("/",sayHello) http.ListenAndServe(":8080",nil) } Gin框架 简介 Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 优于 httprouter,速度提高了近 40 倍。如果你需要极好的性能,使用 Gin 吧。 官方中文文档 Gin框架介绍及使用 | 李文周的博客 (liwenzhou.com) 特性 Gin v1 稳定的特性: 零分配路由。 仍然是最快的 http 路由器和框架。 完整的单元测试支持。 实战考验。 API 冻结,新版本的发布不会破坏你的代码。 框架初识 使用Gin框架返回一个json文件 func sayHello(c *gin.Context/*gin框架中的临时变量,便于后续响应请求*/){ c....

February 11, 2022 · zeroy

数据库基础|JDBC入门|Druid连接池的简单配置

数据库基础 增 新建数据库 CREATE DATABASE {{name}} 新建数据表 CREATE TABLE {{name}}( {{列名}} {{数据类型}} {{约束}}, ..... ); EXAMPLE: CREATE TABLE Users( id int primary key, name varchar(30) NOT NULL, birthday date, score int NOT NULL ); 添加外键约束 建表时添加 CONSTRAINT {{键名}} FOREIGN KEY({{当前表列名}}) REFERENCES {{别的表(别的表列名)}} 建表后添加 alter table {{表名}} add CONSTRAINT {{键名}} FOREIGN KEY({{当前表列名}}) REFERENCES {{别的表(别的表列名)}} 插入元素 EXAMPLE: 向一张名为users的数据表中插入元素: INSERT INTO users(id,name,birthday,score) VALUES (1,'zeroy','2003-4-10',100) , (2,'admin','2003-4-10',99) 查 SELECT {{列名}} FROM {{表名}} WHERE {{条件}} GROUP BY {{分组字段}} HAVING {{分组后条件}} ORDER BY {{排序字段}} LIMIT {{分页限定}} 改 UPDATE {{表名}} set {{程序语句}} WHERE {{条件}} 事务 事务能实现多条命令捆绑,一旦失败,会回滚所有操作。...

February 7, 2022 · zeroy