Forest in an easy difficulty Windows Domain Controller (DC), for a domain in which Exchange Server has been installed. The DC is found to allow anonymous LDAP binds, which is used to enumerate domain objects. The password for a service account with Kerberos pre-authentication disabled can be cracked to gain a foothold. The service account is found to be a member of the Account Operators group, which can be used to add users to privileged Exchange groups. The Exchange group membership is leveraged to gain DCSync privileges on the domain and dump the NTLM hashes.
很早就想重整一下农村家里的网络,毕竟服务器和种种设备(监控、硬碟机、交换机…)都在家里,年初做了一版,简单画了张拓扑,可惜那时候整的不怎么样(资金不足、设备损坏等等原因),现在资金够了,该买的也买了,就随便写写吧。
栈是一种只能从表的一端存取数据且遵循 “先进后出”/“后进先出 (Last in First Out) “ 原则的线性存储结构,主要操作有入栈(push)和出栈(pop),往上叫栈顶,往下叫栈底
栈
在汇编中栈入栈和出栈的操作形式,先从ESP/RSP/SP寄存器(栈指针)指向的内存中读取数据写入其他内存地址或者基础,再根据不同的系统架构将栈指针的数值增加4(32位)或者增加8(64位)
买之前一直在罗兰FP30X和雅马哈P128之间徘徊,最终选择了雅马哈P125,希望这是一个不会让我后悔的选择。
产品价格:看官网价格,P-125 - 概述 - 可攜式數位鋼琴(P系列) - 鋼琴 - 樂器 - 產品 - Yamaha - 台灣
产品规格:P125B本体+U架+单踏(延音踏板)+礼包(转接头)
重量:提着爬六楼累得半死
在此之前我已经有了一台电子琴,注意是电子琴(带打击音效+编曲功能的那种),陪了我8年多,牌子叫(SHUSIAMAN,杂牌),记得当时到SM买的,花了3k多还送了个家教😅,学了两个月左右打下了基础(指基础指法,但这破电子琴只有61键,很难受),后来因为学业和种种原因就搁在那儿不动了,也就偶尔拿出来练个599,另外这台琴琴键是镂空的,不像传统钢琴一样中间是实心的,有到琴行和学校钢琴间摸过真钢,那手感真的不能比。。。
本篇文章仅列出一些易错点及小TIP,还有一些速记技巧(供那些临时抱佛脚的人使用),更深入的内容请自行了解。本人是在福建省考的试,各省份考试方式及费用可能略有不同,请翻阅自己省工信部网站上有关无线电的资料
题目已经熟透不少了,现在上场的话99.9%能拿满分,A类考试题目一共371道题,考试会从题库里边抽出30道题目来,总的来说还算简单,CRAC官网有配套的考试系统,测了几下都能满分,A类和B类题目都差不多,等考完A类后我就开始奋斗B类啦,争取六个月后顺利通过B类。
题目不怎么难,有初中物理基础基本上就能对一半,还有那本小绿皮(现在是小蓝皮?)写得很详细,整本看完基本上稳了。
步入正题,我花了几天刷A类题库,稍微总结了一下,A类40%政策题,60%技术题(大概是这样)
Modern Tetris tutorial for noobs
中文:新人如何入坑俄罗斯方块
【2022/8/14】看这里(TETRiS TRAiNER TRÈS-BiEN (teatube.cn))比我写的详细多了
打块这件事儿,人人都能学会。
菜的不能再菜的账号:Jstris | po7mn1 (jezevec10.com)
Telegram: @t.me/icecliffs(一起打块吧!)
整个烂活
先来回顾一下IP地址,这里只列出三种常用的IP地址,ABC类,IP地址由32个二进制组成。点分十进制表达法为:192.168.0.1
子网掩码的表示方法:
Find two large prime numbers
Calculating the Euler function
Then Choose an e,And e and f(n) are mutually prime
The modulo inverse of e * d ≡ 1 (mod φ) (modulo inverse element: If two positive integers e and n are prime to each other), Then an integer d must be found such that e * d - 1 is divisible by n, or the remainder of e * d divided by n is 1, At this point, d is called the “modulo inverse element” of e, Euler’s theorem can be used to prove that modulo inverse elements must exist. (Two integers a and b), Divided by and integer M, have equal remainders: a ≡ b(mod m), for example, 5 divided by 3 has a remainder of 2, 11 divided by 3 has a remainder of 2, so it can be written 11 ≡ 5(mod 3).
Encryption of plaintext m: c = pow(m, e, N), Ciphertext c
c = pow(m, e, n)
Decryption of ciphertext c: m = pow(c, d, N), Plaintext m
m = pow(c, d, n)
公钥:{e,n}
私钥:{d,n}
对于RSA加密算法
公钥(N, e)为公钥,可以任意公开,破解RSA最直接(亦或是暴力)的方法就是分解整数N,然后计算欧拉函数 φ(n)=(p-1) * (q-1)
再通过d * e ≡ 1 mod φ(N)
,即可计算出 d,然后就可以使用私钥(N, d)通过m = pow(c,d,N)解密明文。
d>=n的4分之1
直接分解模数N是最直接的攻击方法,也是最困难的方法。具体的解析同上RSA安全性分析。
如果n小于256bit,可以使用本地工具进行暴力分解,例如Windows平台的RSATool,可以在数分钟之内完成256bit的n的分解。
如果n大于768bit,可以尝试利用在线网站 http://factordb.com, 这一类在线网站的原理是储存了部分n分解成功的的值。
例题
1 | {920139713,19} |
拆分N:920139713
得到:18443 · 49891
现在已知p
、q
、e
以及c
,可以通过前三个参数求出d
搞出 d 后就可以搞出 c 了
1 | #求明文 |
适用于:使用相同的模数 N 、不同的私钥,加密同一明文消息
基本原理
假如采用两个或者两个以上的**公钥(N,e)**来加密同一条信息,可以得到下面的结论:
1 | c1 = pow(m, e1, N) |
分别拿对应的私钥来加密,可以得到相同的明文m
1 | m = pow(c1, d1, N) |
假设攻击者已知n,e1,e2,c1,c2,即可可以得到明文m,因为e1和e2互质,所以使用欧几里得算法
(用于计算两个整数a,b的最大公约数)可以找到能够满足以下条件的x
,y
:
1 | pow(x,e1)+pow(y,e2)=1 |
假设x为负数,需再使用欧几里得算法来计算
1 | pow(c1,-1) |
则可以得到
1 | pow(pow(c1,-1),-x) * pow(c2,y) = p mod(n) |
如果p<n,则p可以被计算出来。
加密
1 | coding:utf-8 |
解密
1 | #coding:utf-8 |
如果RSA系统的公钥e选取较小的值,可以使得加密和验证签名的速度有所提高,但是如果e的选取太小,就容易受到攻击。
有三个分别使用不同的模数n1,n2,n3,但是都选取e=3,加密同一个明文可以得到:
1 | c1 = pow(m,3,n1) |
一般情况下,n1,n2,n3互素,否则会比较容易求出公因子,从而安全性大幅度的减低。
在此种攻击模型中,攻击者需要掌握的内容包括:加密算法、截获的部分密文、自己选择的密文消息以及相应的被解密的明文。
思路
如果两次加密的n1
和n2
具有相同的素因子,可以利用欧几里德算法
直接分解n1
和n2
.
通过欧几里德算法
计算出两个n
的最大公约数p
:
1 | def gcd(a, b): |
思路
如果两次加密的n1
和n2
具有相同的素因子,可以利用欧几里德算法
直接分解n1
和n2
.
通过欧几里德算法
计算出两个n
的最大公约数p
:
例子
n1=9051013965404084482870087864821455535159008696042953021965631089095795348830954383127323853272528967729311045179605407693592665683311660581204886571146327720288455874927281128121117323579691204792399913106627543274457036172455814805715668293705603675386878220947722186914112990452722174363713630297685159669328951520891938403452797650685849523658191947411429068829734053745180460758604283051344339641429819373112365211739216160420494167071996438506850526168389386850499796102003625404245645796271690310748804327
n2=13225948396179603816062046418717214792668512413625091569997524364243995991961018894150059207824093837420451375240550310050209398964506318518991620142575926623780411532257230701985821629425722030608722035570690474171259238153947095310303522831971664666067542649034461621725656234869005501293423975184701929729170077280251436216167293058560030089006140224375425679571181787206982712477261432579537981278055755344573767076951793312062480275004564657590263719816033564139497109942073701755011873153205366238585665743
1 | def gcd(a, b): |
针对大整数的分解有很多种算法,性能上各有优异。
在p,q的取值差异过大,或者p,q的取值过于相近的时候,Format方法与Pollard rho方法都可以很快将n分解成功。
此类分解方法有一个开源项目yafu将其自动化实现了,不论n的大小,只要p和q存在相差过大或者过近时,都可以通过yafu很快地分解成功。
识别
不能直接分解n,不能使用公约数分解n,可以尝试yafu
。
在RSA
中的e
被称为加密指数。由于e
的选择只需要满足以下条件即可
计算欧拉函数 φ = (p-1) * (q-1),然后选择一个e(1<e<φ),并且e和φ互质
选择小的e
可以缩短加密时间,但是选择的e
不当,可能会造成严重的安全问题。
e=3的小明文攻击
当e=3
,并且明文过小时,导致明文的三次方仍然小于n
,通过直接对密文三次开方,即可得到明文。
原理如下
对明文m进行加密:c = pow(m, 3, N),可以得到密文c。
因为n > pow(m, 3),所以c = pow(m, 3, N) = pow(m, 3),故对密文三次开方,即可得到明文。
有一种特殊的情况是:pow(m, 3) > n,但是不是足够,假设存在这样的k,有下列的公式成立
1 | c = pow(m, 3) + k * n |
爆破k
,当且仅当c - (k * n)
可以开三次方,c - (k * n)
开三次方结果就是明文m。
识别
当e=3时,优先使用这种方法解密。
1 | i=0 |
与低加密指数类似,低解密指数可以加快解密的过程,但是这两者都带来了安全问题。
识别e
看起来非常的大。
使用:RSA-WIENER-ATTACK
如果运行报错
1 | import sys |
如果选取的加密指数e
比较低,并且使用了相同的加密指数e
给若干个接收者发送相同的信息,可以利用低加密指数广播攻击
得到明文。
选取相同的加密指数e
(例如e=3),对相同的明文m进行了加密并进行了消息的发送。有以下的等式成立。
1 | c1 = pow(m, e, n1) |
对上述等式运用中国剩余定理
,在e=3
时,可以得到
1 | c_x = pow(m, 3, n1 * n2 * n3) |
通过对 c_x进行三次开方可以得到明文。
识别
一般来说都是给了三组加密的参数和明密文,其中题目很明确地能告诉你这三组的明文都是一样的,并且e都取了一个较小的数字。
Coppersmith定理指出在一个e阶的mod n多项式f(x)中,如果有一个根小于n^frac{1}{e} ,就可以运用一个O(log n)的算法求出这些根。
这个定理可以应用于RSA算法。如果e = 3并且在明文当中只有三分之二的比特是已知的,这种算法可以求出明文中所有的比特
1 | from isqrt import isqrt |
思路
根据欧拉函数
,可以通过p、q计算出欧拉函数值
φ(n) = (p-1) * (q-1)
之后再根据以下的公式反推出d
d * e ≡ 1 mod φ(N)
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d
将得到的d提交
根据思路可以python进行实现:
1 | # 已知p、q、e求解d |
思路
根据常规的思路,求解出明文m,必须通过通过以下的公式
1 | m ≡ pow(c,d) mod n |
现在缺少的参数有d、n,其中的n可以通过以下的公式可以求出
1 | n = p * q |
而d可以通过以下公式求出
1 | d * e = 1 mod φ(n) |
例题
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
1 | import gmpy2 |
思路
先根据
1 | n = p * q |
对已知的n进行大数分解得到p、q,一般通过在线或者自己通过脚本实现
根据欧拉函数,可以通过p、q计算出欧拉函数值
1 | φ(n) = (p-1) * (q-1) |
之后再根据以下的公式反推出d
1 | d * e ≡ 1 mod φ(N) |
最后对密文c进行解密:m = pow(c, d, N),可以得到明文m。
例题
N=0xee290c7a603fc23300eb3f0e5868d056b7deb1af33b5112a6da1edc9612c5eeb4ab07d838a3b4397d8e6b6844065d98543a977ed40ccd8f57ac5bc2daee2dec301aac508f9befc27fae4a2665e82f13b1ddd17d3a0c85740bed8d53eeda665a5fc1bed35fbbcedd4279d04aa747ac1f996f724b14f0228366aeae34305152e1f430221f9594497686c9f49021d833144962c2a53dbb47bdbfd19785ad8da6e7b59be24d34ed201384d3b0f34267df4ba8b53f0f4481f9bd2e26c4a3e95cd1a47f806a1f16b86a9fc5e8a0756898f63f5c9144f51b401ba0dd5ad58fb0e97ebac9a41dc3fb4a378707f7210e64c131bca19bd54e39bbfa0d7a0e7c89d955b1c9f
e=0x10001
c=0x3dbf00a02f924a70f44bdd69e73c46241e9f036bfa49a0c92659d8eb0fe47e42068eaf156a9b3ee81651bc0576a91ffed48610c158dc8d2fb1719c7242704f0d965f8798304925a322c121904b91e5fc5eb3dc960b03eb8635be53b995217d4c317126e0ec6e9a9acfd5d915265634a22a612de962cfaa2e0443b78bdf841ff901423ef765e3d98b38bcce114fede1f13e223b9bd8155e913c8670d8b85b1f3bcb99353053cdb4aef1bf16fa74fd81e42325209c0953a694636c0ce0a19949f343dc229b2b7d80c3c43ebe80e89cbe3a3f7c867fd7cee06943886b0718a4a3584c9d9f9a66c9de29fda7cfee30ad3db061981855555eeac01940b1924eb4c301
转一下n为十进制,得到
1 | n = int(0xee290c7a603fc23300eb3f0e5868d056b7deb1af33b5112a6da1edc9612c5eeb4ab07d838a3b4397d8e6b6844065d98543a977ed40ccd8f57ac5bc2daee2dec301aac508f9befc27fae4a2665e82f13b1ddd17d3a0c85740bed8d53eeda665a5fc1bed35fbbcedd4279d04aa747ac1f996f724b14f0228366aeae34305152e1f430221f9594497686c9f49021d833144962c2a53dbb47bdbfd19785ad8da6e7b59be24d34ed201384d3b0f34267df4ba8b53f0f4481f9bd2e26c4a3e95cd1a47f806a1f16b86a9fc5e8a0756898f63f5c9144f51b401ba0dd5ad58fb0e97ebac9a41dc3fb4a378707f7210e64c131bca19bd54e39bbfa0d7a0e7c89d955b1c9f) |
然后n就等于
30064958471180141352963255964320727764941087854957385562672821662319854021395100968823341108075020928542437446993994119863902565874355296188498304761389336438421889636409561936141985786801002923752627293790265351723795968412774268086467114263767947693310444934316205390814185802517514694528501333851255084653925181726978734804806707740444755908398751964899143494522781405457103697373868972836201511424363601490903086488506985489526910314474245106338585623571369549388434865567951986866445306840505397268281889886738015891982162371413136885989746931929787765617838750381226036784122498143172854419447324975505933540511
接着分解
p=57970027
q=518629368090170828331048663550229634444384299751272939077168648935075604180676006392464524953128293842996441022771890719731811852948684950388211907532651941639114462313594608747413310447500790775078081191686616804987790818396104388332734677935684723647108960882771460341293023764117182393730838418468480006985768382115446225422781116531906323045161803441960506496275763429558238732127362521949515590606221409745127192859630468854653290302491063292735496286233738504010613373838035073995140744724948933839238851600638652315655508861728439180988253324943039367876070687033249730660337593825389358874152757864093
接着搞出d就可以了
1 | import gmpy2 |
首先通过公钥文件public.pem获取n、e
通过公钥文件获取n、e
1 | from Crypto.PublicKey import RSA |
通过在线网站
http://www.factordb.com/index.php?query=74207624142945242263057035287110983967646020057307828709587969646701361764263 分解n
可以得到p=258631601377848992211685134376492365269以及q=286924040788547268861394901519826758027
n=
74207624142945242263057035287110983967646020057307828709587969646701361764263
e=
65537
通过在线网站
http://www.factordb.com/index.php?query=74207624142945242263057035287110983967646020057307828709587969646701361764263 分解n
可以得到p=258631601377848992211685134376492365269以及q=286924040788547268861394901519826758027
生成私钥
1 | #python2 |
最后使用生成的私钥将加密文件解密
1 | openssl rsautl -decrypt -in ./RSA/flag.enc -inkey private.pem -out flag.txt |
求解d
一般的除了可以利用gmpy2
模块的gmpy2.invert(e,phi_n)
函数之外,还可以利用 扩展欧几里德算法
计算出d
,以下是python
的实现:
1 | #coding:utf-8 |