IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 一……二……开门!(CTFshow挑战题) -> 正文阅读

[Python知识库]一……二……开门!(CTFshow挑战题)

这是在CSDN上的第一篇文章,本来准备发在知乎上的,不过想了想知乎还是放理论性的文章吧(理论带师),先在CSDN上放篇文章试试水。

作为学了近两个月的密码学大一弱鸡(现在应该升级为大二弱鸡了),第二次写挑战题,没想到给我写出来了。题目来源于CTFshow上最新的一道挑战题,昨天刚出的本周挑战题。昨天yj巨佬叫我来写这道题,我看了两分钟就知道该怎么去做了(小吹一手),佩尔方程直接干就完事了,事实证明也确实是这么个东西,而且还是最简单的一类佩尔方程,佩尔方程详见等风(本人)的知乎。要解佩尔方程,关键就在于找到它的一组基本解,如果d比较小的时候暴力去解就行了,以前解过的佩尔方程d都比较小,而昨天的这道题目d达到了39352。由于我的错误判断,我错误的认为这个d暴力去找基本解也用不了太久(实际原因其实是我不想花时间写二次根式的连分数展开计算的脚本,当时吴哥找我打球doge),然后写了个脚本暴力去找。本以为最多一个小时就能跑完,结果事实是我从晚上八点跑到第二天早上十点起床还没跑出来(啊这),于是丢掉了拿一血的机会(本来一血十拿九稳),无奈只好写了个连分数展开的脚本去找基本解了。

题目如下:

from door_sum import door_sum

# door_sum(l, d, n): calculate the sum of an arithmetic sequence
# with `l` being the first number, `d` being the common difference,
# and `n` being the number of terms

# Sanity check:
assert door_sum(1, 1, 100) == 5050

WELCOME = '''HELLO!
Open the door, and I'll show you my flag!
'''

if __name__ == '__main__':
	while True:
		try:
			print(WELCOME)
			n_1 = int(input('n_1 = '))
			n_2 = int(input('n_2 = '))
			if (n_1 > 2 ** 0x1337 and n_2 > 2 ** 0x1337 and door_sum(1, 1, n_1) == 0x1337 * door_sum(1, 2, n_2)):
				print('OKOK! YOU GOT THE FLAG:')
				with open('flag.txt') as f:
					print(f.read())
			else:
				print('Uh-Oh, the door is not opened...')
		except Exception:
			print('NONONO!')

图一为题目描述,图二为task.py里面的内容,首先我们一看这个题目需要连接虚拟机上的端口,但这不是重点,task里面的东西才是重点。

分析如下:door_sum函数给了介绍,是求等差数列的数项和,其中l,d,n参数分别代表首项,公差,项数,然后题目要去找一组n1,n2满足n1>2**0x1337,且n2>2**0x1337,并且还要求door_sum(1,1,n1)==0x1337*door_sum(1,2,n2),由等差数列求和公式,不难得到:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? n_{1}(n_{1}+1)=2*4919*n_{2}^{2}=9838n_{2}^{2}

两边同乘4并配方得:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??(2n_{1}+1)^{2}-39352n_{2}^{2}=1

令2n1+1=x,n2=y,得:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?x^{2}-39352y^{2}=1

标准的佩尔方程

为了找它的基本解,首先我暴力去跑了,跑了14个小时都没出(麻了),暴力脚本如下:

from gmpy2 import *
i=39351
while 1:
    if (i*i-1)%39352==0:
        t=(i*i-1)//39352
        s=isqrt(t)
        if s*s==t:
            print(s)
            print(i)
            break
    i+=39352

与此同时还有yj的电脑去跑:

from gmpy2 import *
i=39353
while 1:
    if (i*i-1)%39352==0:
        t=(i*i-1)//39352
        s=isqrt(t)
        if s*s==t:
            print(s)
            print(i)
            break
    i+=39352

同时去跑,因为有x^{2}\equiv 1(mod \, d),所以x在模d的剩余系下有1和-1两个解。

事实证明这还是不行,所以今天还是去写了连分数求解基本解的脚本,脚本如下(Python还是爽):

from gmpy2 import *
def Cal_CF(List):       
    List.reverse()
    fenmu=0
    fenzi=1
    for i in List:
        fenmu,fenzi=fenzi,i*fenzi+fenmu
    return fenmu,fenzi

t=39352
m=isqrt(t)
x=t**(0.5)
a=[]
a.append(m)
b=m
c=1
while a[-1]!=2*a[0]:
    c=(t-b*b)//c
    tmp=(x+b)/c
    a.append(int(tmp))
    b=a[-1]*c-b
print(len(a)-1)
print(a)
a=a[:-1]
fenmu,fenzi=Cal_CF(a)
print(fenmu)
print(fenzi)

运行结果如下:

?于是得到x0=2662019309411216232806345449321879270495478346383,

y0=13419236180444562206941613278603693768762410762

下面的步骤就随心所欲了,严谨的话用矩阵快速幂跑跑,像我这种比较懒,不想写快速幂的菜鸡就递推吧,不把所有的项都考虑,只要找到一个就OK,求得一组满足条件的解:

x=86833700586376516456658084395568955558341195849330843437290243943433685582766187840375858252210187345259800549272487238934577083568752437187617662098181754495075281250131821716251733817147332846402906297424592418285902019756902324672317442322524112732994577163267082831296415472729766517925315817401314480929828509601608585744532858031984268463110633085136387648024814370626718954301394545784438898206086544081834091734286315786256695053535379374673806866244693343668079563272494972269536714511170482023517803868922152562345195454956008001647260527245922933196686086999500184505430243498535060316292085767447852616873123329289774398435954269820997449955307494326829275252383025841325816317692892824162659577350508400045934490431632235190460549786918710374565221592688808116023820553436665037362924366410029576788433346469810240393555723980886010788885622963733966368850968194302918071030482441523960813917820046688022678735104317197604897348123674277644014182770875920834695400612296311924763644886263620917325164182350649646441081380911846495072251331880092467404679199814209399642000934350331668435845236846475332527206538251403295936486101218504731986957606951756215164378679804203757336905988601971816872742685933232282803376534048365300554095535810116951870810327994361864819207035544826639136297347820463121132858680322402698795165424804679705167190793355415172852624711118005382368778393373331664343235550614095357385626663082879314920059902311931327057404579235637413326436611289952165300767084159715742615846668676510896992541470470086537258582654977

y=437728581633888083858367708039402756852498450186346504287722745899153032175779500808848091558764833771169119679115212554825697413030945023488837698382386967940864893879412228700594064548210078856172139547833235593433623616688362493444913792921648804702573282835418230296000408139179746088624888318482906160498108665924314585699958049437764499638149841476435645577101983286191278391160407094500616138025000175456844226099999033374234681531858016611100810921938392423128216297046747192551275204072364252078277571581274905065508718492837730442584268519681924118338446004556316836129940397748419559881614152973377746555141808764702747159920326844368385784704080323477358881772508871339145032544583444571293688936609843751507863552892576772497249081692913534461081970619431934383086765847740311292143030313634923461678760283790360347600671319569610127023812773184017905938569649904698501326523072573744306454272283590816590801002940408812876020068645981185363631818918606191899175312518465368170838189037599964523441562176102935185563310228042500243230933439128271816229498171417596704624509953680212342916187683448393839058416988090110870447197681608420719687753758226190932683407130755479603553467981551844338325495066313986660337619634949075523130805868399920303791099750919777263143810170383413035808597258448621121177970762877122582564518596064644675361859064651795644608669190087229267761249645779050067172167506433696941258142174063657680752820232826728374450141823859534725454998696358188243228630624847723887424493071837795193327664135694772817931788992

然后n1=(x-1)//2,n2=y,把这两个值输入端口,得到实时更新的flag:

完美谢幕 。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:42:06  更:2021-07-28 07:42:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/25 14:21:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计