数据结构复习

红黑树:红色节点不能连续两个,从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点,根和叶子(null)是黑的

AVL:AVL树中任何节点的两个子树的高度最大差别为1

快排:worst case是n^2,优化变为nlogn的最差:

哈希表的separate chaining(分离链接法)方法:直接把冲突的放到一个链表里面

skiplist:跳表,一个英文的说明
https://segmentfault.com/a/1190000018452079, https://blog.csdn.net/weixin_41462047/article/details/81253106 找关键节点,先在关键节点这里搜索

小顶堆:堆实际上是一棵完全二叉树

  • 复杂度:创建一个堆是O(n)的,建堆的时候你看看是不是多次调用了调堆的函数呢,那肯定就不只是logN了,如果从底部最后的父节点开始建堆,那么我们可以大概算一下:假如有N个节点,那么高度为H=logN,最后一层每个父节点最多只需要下调1次,倒数第二层最多只需要下调2次,顶点最多需要下调H次,而最后一层父节点共有2^(H-1)个,倒数第二层公有2^(H-2),顶点只有1(2^0)个,所以总共的时间复杂度为s = 1 * 2^(H-1) + 2 * 2^(H-2) + … + (H-1) * 2^1 + H * 2^0 将H代入后s= 2N - 2 - log2(N),近似的时间复杂度就是O(N)。(https://zhidao.baidu.com/question/566218328045983884.html)

最小生成树:https://blog.csdn.net/a2392008643/article/details/81781766

  • 加点的方法:Prim
  • 加边的方法:Kruskal

最短路径:Dijkstra:https://blog.csdn.net/heroacool/article/details/51014824 这个里面有一些错误,但大致是对的

最大流最小割:https://www.bilibili.com/video/BV1hW411W7Tb ,本质上是在找一条能过去的路

Mac-wifi密码破解

相关教程

https://www.cnblogs.com/diligenceday/p/6344487.html

另外还有一个文章:https://www.oschina.net/question/4873_16006 介绍WEP和WPA/WPA2的破解方法

其实最简单的就是用Wi-Fi万能钥匙

安装

安装:aircrackhttp://www.aircrack-ng.org/doku.php?id=install_aircrack#linux_bsd_osx

  • 直接brew install aircrack-ng (得首先安装homebrew)

网卡名称获取

通过ifconfig命令获取当前的网卡的名字, 我这边网卡名字为en0

查找所有的WiFi

  • /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s

    信号最好的是:ChinaNet-TRqX,所以来监听4号channel

    • 无线信号dbm都是负数,最大是0。因此测量出来的dbm值肯定都是负数。因为dbm值只在一种情况下为0,那就是在理想状态下经过实验测量的结果,一般我们认为dbm为0是其最大值,意味着接收方把发射方发射的所有无线信号都接收到了,即无线路由器发射多少功率,接收的无线网卡就获得多少功率。当然这是在理想状态下测量的,在实际中即使将无线网卡挨着无线路由器的发射天线也不会达到dbm为0的效果。所以说测量出来的dbm值都是负数,不要盲目的认为负数就是信号不好。
    • 信道:https://blog.csdn.net/AcerFront/article/details/90749363

    • 都说我们在信息高速路上,那么这些信道(即channel)就是一条条高速公路,而channel被赋予的意义,就是”高速公路每条路的编号“。 正经点说,信道也称作通道(Channel)、频段,是以无线信号(电磁波)作为传输载体的数据信号传送通道。无线网络(路由器、AP热点、电脑无线网卡)可在多个信道上运行。在无线信号覆盖范围内的各种无线网络设备应该尽量使用不同的信道,以避免信号之间的干扰。 好了,疑问解决了,那么我们经常看到的WiFi上标注的2.4GWiFi和5GWiFi又是啥玩意,这其实指的是频段,频段我们不熟悉,那频率总知道了吧,那频段就是由频率组成的区间而已,2.4G WiFi是指2.4GHz-2.5GHz的无线频率,5G WIFI则指4.9GHz-5.9GHz的无线频率。 而信道(即channel)即是在这个区间上进行再一次划分,就像是现在修好了一条高速公路,然后为其划分车道是一个道理,划分车道的目的则是相对互不干扰。

      • 从2.4GHz-2.5GHz共划分出13个信道(其实有14个,国内可用1-13的),那其实,信道(channel)即是对每个信道的中心频率(就是一个子区间的中点)进行了编号。而既然是“车道”,那肯定需要宽度,一般来说,信道宽度定义为20MHz,我们很容易从下图中看出1、6、11是完全没有重叠部分的,那么就代表着完全互不干扰的,所以仅仅有3个车道。

      • 5GHz信道划分,国内室内AP可用36, 40, 44, 48, 52, 56, 60, 64, 149,153, 157, 161, 165等13个信道。我们知道5G WiFi的频段是 4.9GHz-5.9GHz,有整整1GHz可分呢(相对于2.4G只有0.1GHz),那即是每个信道的带宽是20MHz,13个信道在完全不重叠的情况下也才 20 * 13 = 260MHz = 0.26GHz ,所以有整整13个车道。

    监听(嗅探)

    • sudo /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport en0 sniff 4

    • 之后Ctrl-C会显示Session saved to,这就是后面用到的cap文件。

    • 之后输入exit()就可以退出

    • 要在里面找:WPA(1 handshake)

      • WPA-PSK攻击分为以下几个步骤:
        1. 根据passphrase,SSID生成PMK,即PMK = pdkdf2_SHA1(passphrase, SSID, SSID length, 4096)
        2. 捕获EAPOL四次握手的数据包,得到ANonce,SNonce等信息,用于计算PTK,即 PTK = PRF-X(PMK, Len(PMK), “Pairwise key expansion”, Min(AA,SA) || Max(AA,SA) || Min(ANonce, SNonce) || Max(ANonce, SNonce))
        3. 使用MIC Key计算EAPOL报文的MIC,即MIC = HMAC_MD5(MIC Key, 16, 802.1x data)
        4. 将计算得到的MIC值与捕获到的MIC值对比,如果相同则破解成功。
      • WPA-PSK攻击的主要难点在于大量计算PMK所需要的计算量。一台普通的计算机通常的计算能力在500pmks/s,想要对8位的纯小写字母组合密码进行暴力破解所需要的时间为14年,所以想要破解WPA-PSK只有两种可能:1.用户使用了常见的弱密码;2.堆砌计算资源,获得超级计算机量级的计算能力。
      • 一些术语:
        • AP(Access Point): 网络接入点,是一种连接无线或有线网络的设备。就是俗称的路由器。
        • MAC(Media Access Control Address): 相当于网卡的身份证,MAC 地址本身是不能修改,但是可以通过伪造MAC 地址欺骗AP。
        • WEP(Wireless Encryption Protocol): 无线加密协议。很早的一种加密协议,容易破解。
        • WPA/WPA2(Wi-FiProtected Access): 基于WEP更安全的加密系统。
        • Handshake:握手。
        • IV(Initialization Vector)s:初始化向量。

    实际的例子

    必须得等到那边有一个连接的信息才行。

    虽然也是跑字典,但是这里是把握手信息拿下来之后跑的字典,可以离线来整。

    这里用的364812A是我的Wi-Fi,我自己操作让iPad在中间连接了一次。

    上面写的是11,所以需要监听11信道。

    通过aircrack-ng得到的结果,复制到一个文本编辑器里面,搜索1 handshake

    看到前面的序号是804,对应的地址是:80:89:17:99:90:1E

    所以就可以用aircrack-ng -w /Users/henryfox/Desktop/Temp/dict.txt -b 80:89:17:99:90:1E /tmp/airportSniffJgFj6B.cap进行破解了。-w后面是你的字典的路径。

    我的字典里面就写了个123456和我的密码,所以就破解出来了……

    密码字典到哪找

    kali里面其实有……直接到kali系统里面,/usr/share/wordlists

    需要先解压:sudo gzip -d /usr/share/wordlists/rockyou.txt.gz

    这里各种字典,可以用head xxx -n xxx来看

    具体描述:https://blog.csdn.net/qq_42333641/article/details/88413390

    dirb

    big.txt #大的字典 small.txt #小的字典 catala.txt #项目配置字典 common.txt #公共字典 euskera.txt #数据目录字典 extensions_common.txt #常用文件扩展名字典 indexes.txt #首页字典 mutations_common.txt #备份扩展名 spanish.txt #方法名或库目录 others #扩展目录,默认用户名等 stress #压力测试 vulns #漏洞测试

    dirbuster

    apache-user-enum-** #apache用户枚举 directories.jbrofuzz #目录枚举 directory-list-1.0.txt #目录列表大,中,小 big,medium,small

    fern-wifi

    common.txt #公共wifi账户密码

    怎么复制文件出来呢?直接复制粘贴就行,也可以拖动。在virtual box里面有设置,默认就支持了。

hashcat

我们可以用hashcat,在https://blog.csdn.net/u010953692/article/details/83548524 有说明。

Python多线程

https://www.cnblogs.com/fnng/p/3670789.html

做一下摘录(包括评论区里面指出的问题):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import threading
from time import ctime, sleep


def music(func):
for i in range(2):
print("I started listening to %s. %s" % (func, ctime()))
sleep(1)
print("I finished listening to %s. %s" % (func, ctime()))


def movie(func):
for i in range(2):
print("I started to watch %s! %s" % (func, ctime()))
sleep(5)
print("I finished watching %s! %s" % (func, ctime()))


threads = []
t1 = threading.Thread(target=music, args=('爱情买卖',))
threads.append(t1)
t2 = threading.Thread(target=movie, args=('阿凡达',))
threads.append(t2)

if __name__ == '__main__':
for t in threads:
s(True) # 守护线程,需要在start之前设置;守护线程的意思就是,被守护的挂掉了他也就走了,比如背景音乐
t.start()

for t in threads:
t.join()
# 为什么要写在另一个循环里面呢?
# 这两个线程中,如果第一个比第二个快,那就是先在第一个线程中阻塞,第二个线程来了再继续阻塞;
# 如果第二个比第一个快,那就是第一个线程中直接阻塞到头了,第二个线程执行join的时候已经做完了,不用阻塞了

print("all over %s" % ctime())
  • 守护线程,需要在start之前设置;守护线程的意思就是,被守护的挂掉了他也就走了,比如背景音乐
  • join为什么要写在另一个循环里面呢?为什么不在第一个循环里面直接写上呢?
    • 这两个线程中,如果第一个比第二个快,那就是先在第一个线程中阻塞,第二个线程来了再继续阻塞;
    • 如果第二个比第一个快,那就是第一个线程中直接阻塞到头了,第二个线程执行join的时候已经做完了,不用阻塞了

elementUI-参数传递类型错误

[Vue warn]: Invalid prop: type check failed for prop “min”. Expected Number with value 0, got String with value “0”.

这个的问题是因为,写的时候不是用的bind,而直接写了等号。

也就是:<el-input-number min=0>

那应该怎么写呢?应该改成:<el-input-number :min=0>(注意这里的冒号!)

vuejs双向绑定

如果直接把一个东西传入自己创建的一个vue的component,就会导致这个只是单向绑定,报错:

[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s value. Prop being mutated: “store”

但是我发现,如果不是裸类型(这里我用的一个字符串),就可以双向。所以我传进去了一个类的实例,在自己的component里面用它的一个属性,这就解决了