数字逻辑
数字逻辑与数字系统
基础知识
逻辑门
单输入逻辑门
两输入逻辑门
多输入逻辑门
就是多个入口
CMOS晶体管
nMos能够很好的导通低电平0,因此源极接地
pMos能很好地导通高电平1,因此源极接电源
CMOS非门和CMOS与非门
和非门与非门没啥区别。
组合逻辑设计
引言
数字逻辑电路
是一个可以处理离散值变量的网络
有输入、输出、功能规范和时序规范
结点和模块
结点是一段导线,通过电压传递离散值变量
输入节点
输出结点
内部结点
模块本身是一个带有输入、输出、功能规范和时序规范的电路
数字逻辑电路的分类
组合逻辑电路
任一时刻的输出仅由该时刻的输入信号决定
无记忆
时序逻辑电路
任一时刻的输出由该时刻的输入和电路该时刻的状态共同决定
有记忆
组合逻辑电路
每个电路模块都是一个组合逻辑电路
每个电路结点要么是输入,要么只连接一个电路的一个输出端
电路中不包含回路
布尔代数
值:0或1
计算:与(·)或(+)非(A‾\overline{A}A)
最大项MiM_iMi和最小项mim_imi
蕴含项
项的乘积
最小项
包含全部输入变量的乘积项
mim_ ...
计算机网络
概论
路由交换
电路交换
要求双方建立连接后才能够交换数据。端到端连接。
分组交换
将数据包划分为一个个小的数据段,在每个数据段首部加上信息,通过这些信息将数据包进行转发,最后在目的地再把数据重组回来。
分组交换的本质是存储转发,即可以实现队列缓存。
两种交换的对比
分组交换提供了更好的贷款共享,更加简单有效、成本更低。
电路交换时延低
丢包、延迟、吞吐
当缓冲队列满时,无法将数据包加入队列就会产生丢包。
延迟可以分为四个部分:处理、队列、传输、传播
从知乎copy下
nodal processing delay:
检查错误位
选择输出链路
高速路由器处理延迟-微妙级
queueing delay:
等待被发送到输出链路上的时间
取决于路由器的拥塞程度
Transmission delay:
R=链路带宽 (bps)
L=分组长度 (bits)
发送分组比特流的时间 = L/R
Propagation delay:
d = 物理链路的长度
s = 介质的信号传播速度 (~2x108 m/sec)
传播延迟 = d/s
注意: s和R是两个完全不同的速度参量!
s 是介质的 ...
编译原理
概论
编译和解释
编译器就是要生成一个程序后才能执行。
解释器将代码一行行执行。
编译过程
词法分析 -> 语法分析 -> (语义分析、中间代码生成) -> 循环优化 -> 生成目标代码
编译的T型图
左臂上是初始语言,右臂上是目标语言,下面是编译器语言
自增和移植产生代码
自增就是通过自己的语言(比如汇编)先编译一小部分目标语言,假设目标为C语言,则可以分为small C middle C large C三个部分,编译出small C,然后结合small C编译middle C这样子。
移植就是更改语言类型。
基本概念
程序语言的定义
语法是指一组规则,可以分为词法规则和语法规则
词法规则
规定了单词符号(变量名运算符那些)的形成规则,描述工具为有限自动机
语法规则
即如何从单词符号形成更大的结构(语法单位),描述工具为上下文无关文法
程序语言的语法描述
基本概念
字母表
符号的非空有限集
符号串
即符号的有穷序列,空符号串用ϵ\epsilonϵ表示
符号串集合
定义很直观了,就是符号串构成的集合
符号串的运算
相等
长度
积
就是 ...
数据库原理
数据库基本概念
定义
数据库(DataBase)是长期存储在计算机的、有组织的、可共享的、数据集合。
数据库管理系统
DBMS,对数据进行定义、存储、操作控制管理等。
数据库系统
DBS,针对某种应用而开发的信息管理系统。
事物
transaction,指一个或一组数据库操作。
事物处理器
有如下一些任务:记日志、并发控制、消除死锁
ACID
事物有如下特性
A - 原子性 C - 一致性 I - 独立性 D - 持久性
关系数据库设计
函数依赖
一个函数依赖是指两个元组在满足属性A1…An时,也在B1…Bm上满足,并且这得是一个单一映射。
键
是一个集合,这个集合里面的属性能够决定一个元组,且该集合的真子集不能决定元组。
主键
当键多于一个时,需要规定一个作为主键
超键
就是键集合的超集
函数依赖规则
对于函数依赖(下文简称FD),有两点重要规则。
A->B, B->C => A -> C
A1…Am -> B1…Bn => A1…Am -> B1, A1…Am -> B2, … , A1…Am -> Bn
平凡FD
对于A ...
LeetCode刷题记录
滑动窗口
1004. 最大连续1的个数 III
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
滑动窗口模板题,有点类似于快慢指针?
1234567891011121314N = len(A) res = 0 left, right = 0, 0 zeros = 0 while right < N: if A[right] == 0: zeros += 1 while zeros > K: if A[left] == 0: zeros -= 1 left += 1 res = max(res, right - left + 1) right += 1 return res
697. 数组的度
给定一 ...
LeetCode-202102
566. 重塑矩阵 - 20210217
在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。
给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。
如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
其实numpy就可以做这个事,但是自己写一下也行
12345678910111213141516class Solution: def matrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]: raw_r = len(nums) raw_c = len(nums[0]) if raw_c * raw_r != r * c or raw_c == c: return nums cnt = 0 ...
CTF-Pwn-栈溢出漏洞
此前的基础知识可以看从0到1或者这篇文章https://zhuanlan.zhihu.com/p/25816426
覆写返回地址
1234567891011121314#include <stdio.h>#include <unistd.h>void shell() { system("/bin/sh");}void vuln() { char buf[10]; gets(buf);}int main() { vuln();}
使用如下指令编译
gcc stack.c -o stack -no-pie -fno-stack-protector
通过pwngdb在0x401163下断点
发现此处存着我们的返回地址
我们的返回地址从0x58开始,所以需要覆盖的长度为ret_addr - (rbp-0xa),为了简化去掉前面的部分,就是0x58-(0x50-0xa) = 18
shell函数的地址为
所以编写下攻击代码
1234from pwn import ...
CTF-Reverse-常用算法特征
参考文章:https://bbs.pediy.com/thread-265939.htm#msg_header_h1_3和Nu1L的从0到1
常量
算法
特征值
备注
TEA
9e3779b9
Delta值
AES
63 7c 77 7b f2 6b 6f c5
S盒
AES
52 09 6a d5 30 36 a5 38
逆S盒
DES
3a 32 2a 22 1a 12 0a 02
置换表
DES
39 31 29 21 19 11 09 01
变换数组PC1
DES
0e 11 0b 18 01 05 03 1c
变换数组PC2
DES
0e 04 0d 01 02 0f 0b 08
S函数表格1
BlowFish
243f6a88 85a305d3 13198a2e 03707344
P数组
MD5
67452301 efcdab89 98badcfe 10325476
寄存器初始值
MD5
d76aa478 e8c7b756 242070db c1bdceee
Ti数组常量
sha1
67452301 efcdab89 9 ...
CTF-HGame-2021
Reverse
week1
pypy
其实就是dis模块加密后的阅读了,照着文档一步步连读带猜都不难。
12345678910from typing import *flag = '30466633346f59213b4139794520572b45514d61583151576638643a'res = bytes([int(flag[i*2:i*2+2], 16) for i in range(len(flag) // 2)])length = len(res)raw = []for i in range(length): raw.append(res[i] ^ i)for i in range(length // 2): raw[i*2], raw[i*2+1] = raw[i*2+1], raw[i*2]print(''.join(list(map(lambda i : chr(i),raw))))
helloRe
首先长度为22,每次跟一个值异或,然后值减一,跟一个字节数组对比,简单题。
123456789101112key = ...
CTF-Reverse-HWS线上赛复现
obfu
这是一道多重加密的题目,稍微比较复杂,不熟悉加密算法(一般逆向中用到的)的话可以看这篇文章https://bbs.pediy.com/thread-265939.htm#msg_header_h1_3
用到ida插件find_encrypt,首先找到题目入口
其中的encrypt和md5是我修改的名字,md5直接使用插件发现即可。所以程序的主逻辑是
将输入字符串进行加密
再将加密的字符串和md5后的"admin"相比较(16位)
进入encrypt函数,发现前面是一段逻辑,先往后看到
有两段相同的代码,到第二个子函数中发现了8个数字
对应sha-256,所以这个步骤是取到"admin"的sha-256值
在这里可以对上面的memset的位置重新定义成int数组,方便后续逆向
往下看到这个子函数中,%256和异或明文,可以猜测是rc4加密算法。
但是到这里就得回去看看这些变量都是什么了,不过通过rc4中的逻辑,可以知道最后一位是明文,在encrypt中,输入的字符串被赋值给了Dst,然后又给了v14,所以回到开头,观察是如 ...