目录
文章目录
一、MISC
1、涐贪恋和伱、甾―⑺dé毎兮毎秒
附件下载得到一张图片,根据题目提示——laosebi;
其实我们可以猜到大概可能是lsb隐藏,所以按道理说我们应该丢进Stegsolve.jar里面,但是这里教一个简单且更便捷的方法;
我们使用kali里面的隐写工具zsteg;
zsteg简介;
zsteg可以检测PNG和BMP图片里的隐写数据。
目前,zsteg支持检测:
1、LSB steganography in PNG & BMP
2、zlib-compressed data
3、OpenStego
4、Camouflage 1.2.1
5、LSB with The Eratosthenes set
github项目:https://github.com/zed-0xff/zsteg
作者网站:http://zed.0xff.me/
使用命令;
zsteg xxx.png
LitCTF{e8f7b267-9c45-4c0e-9d1e-13fc5bcb9bd6}
2、你说得对,但__
下载附件得到一张二维码扫描没有任何信息;
那我们就尝试丢进kali使用foremost -i 进行分解,发现得到四张被分割的二维码碎片;
分解图片;
foremost -i xxx.png
那这里就简单了,我们可以使用ps自己尝试拼凑一下(听说可以我没尝试过),这里我使用的是脚本直接合成的;
脚本如下;
from PIL import Image
# 假设四个二维码部分分别命名为 1.png, 2.png, 3.png, 4.png
# 并且它们的大小都是相同的
# 读取四个二维码部分
top_left = Image.open('1.jpg')
top_right = Image.open('2.jpg')
bottom_left = Image.open('3.jpg')
bottom_right = Image.open('4.jpg')
# 获取单个部分的宽度和高度
width, height = top_left.size
# 创建一个新的图像,大小是单个部分宽度和高度的两倍
full_qr = Image.new('RGB', (width * 2, height * 2))
# 将四个部分拼接到新图像上
full_qr.paste(top_left, (0, 0))
full_qr.paste(top_right, (width, 0))
full_qr.paste(bottom_left, (0, height))
full_qr.paste(bottom_right, (width, height))
# 保存或展示完整的二维码图像
full_qr.save('full_qr.png')
full_qr.show()
最后直接运行即可;
使用QR扫描即可;
LitCTF{Genshin_St@rt!!}
3、原铁,启动!
下载附件得到一张像是什么符号的图片(现在暂时不知道)
那我们来分析一下;
其实这题相对来说也比较简单算是一道半社工的题目,就是简单对照编码就行,那从题目名字中我们可以得知可能是《原神》和《崩坏:星穹铁道》游戏里的某种编码;
什么是社工?
那我们就直接百度一下原神码表即可;
得到;LitCTF{good_
接着百度一下崩坏:星穹铁道码表;
LitCTF{good_gamer}
4、Everywhere We Go
下载得到一首音乐secret,根据常见的音频隐写也就那几个,Audacity、deepsound、silenteye等等;
推荐文章:常见音频隐写
这里我们直接先使用最常见的Audacity进行解析;
直接全部勾选多视图、波形、频谱图进行查看(以防万一也可以一个一个进行查看,尽量兜查看一遍)
发现这里好像有东西,我们按住Ctrl+鼠标滚轮进行放大查看;
LitCTF{Calculate_Step_By_Step}
5、盯帧珍珠
下载得到一张丁真的jpg图片,使用window图片查看发现会卡住,那我们使用010打开进行查看;
很明显开头GIF,那我们也把图片后缀修改为GIF(注意后缀要大写的GIF);
我们打开发现是动态图片且里面夹杂着flag,那这里我们肯定要逐帧进行分解,当然这里方法很多我就不一一说明了;
LitCTF{You_are_really_staring_at_frames!}
6、舔到最后应有尽有
下载得到LOVE_LETTER.txt文件;
打开查看发现是一大段的base64编码,这里如果去一个一个解码的话效率还有正确率兜太慢了,这里推荐一个非常好用的工具PuzzleSolver(可以说MISC必备工具之一);
PuzzleSolver简介;
专为misc手打造的瑞士军刀(?),整合了多种脚本(base,字频分析,png/bmp自动修复文件头,图片盲水印等等)的带GUI的工具
下载链接:https://www.123pan.com/s/q2J1jv-Mvavd.html提取码:0905
我们直接Ctrl+A全选复制进去进行解码即可;
LitCTF{TanJi_j1e_jie_n1_dAi_w0_z0u_b_}
7、关键,太关键了!
下载附件得到两个txt一个flag另外一个key;
根据题目所给出的提示——好像某些字符出现的频率很高哦
我们可以猜测是字频统计,这里统计字频的方法不唯一可脚本、可在线工具、可PuzzleSolver;
这里我还是使用PuzzleSolver来操作(因为我后台刚好挂着);
最多的:bingo(因为后面有个横杠看着非常不舒服)
这里如果经验老套的一些misc师傅可能就可以看出来一点了(关键字Keyword密码);
但是我们新手咋办嘞,哎不要慌,我们还是可以使用工具《随波逐流》
随波逐流简介:
1、随波逐流CTF编码工具:一站式编码解码解决方案。
2、随波逐流CTF编码工具是一款功能强大且多功能的编码解码离线集成工具。它旨在为用户提供一站式的编码解码解决方案,满足在网络安全、密码学以及信息技术领域的各种需求。这款工具涵盖了众多经典的编码解码算法,以及一系列创新的隐写识别功能,适用于网络安全、密码学、信息技术等多个领域,为用户提供了全方位的编码解码解决方案。无论是初学者还是专业人士,都可以从中受益,提高编码解码工作的效率和准确性。
下载链接:https://www.123pan.com/s/q2J1jv-Mvavd.html提取码:0905
根据题目要求全部小写得到;
LitCTF{i_miss_you_boss}
8、女装照流量
下载附件得到一个流量包pacp,那我们丢进Wireshark进行分析;
这边照顾到很多人可能第一次接触蚁剑流量所以分析的比较详细;
查看协议分级,发现http文件特别多,那我们全部导出来慢慢分析;
得到三张图片,简单分析了一下发现并没什么用,那我们返回继续分析http(可以直接过滤一下);
观察发现肯定是上传了什么东西(猜测不是zip就是flag文件),而且用的还是使用蚁剑链接上传的;
为什么说是蚁剑链接上传?
-
User-Agent字符串:蚁剑在发送HTTP请求时可能会使用特定的User-Agent字符串,这可以作为识别流量的一个特征。
-
HTTP请求模式:蚁剑通常会发送特定格式的HTTP请求,这可能包括特定的参数名、路径或数据格式。
-
请求频率:与正常用户流量相比,蚁剑可能会在短时间内发送大量请求,这种异常的请求频率可能会引起注意。
-
数据编码:蚁剑可能会使用Base64或其他编码方法来编码发送的数据,这些编码数据在HTTP请求的POST数据或URL参数中可能很容易被识别。
-
特定的HTTP参数或路径:蚁剑可能会使用特定的HTTP参数名称或URL路径来传输数据,这些名称或路径可能与常见的WebShell路径或参数相匹配。
-
异常的HTTP响应:WebShell可能会返回异常的HTTP响应代码或内容,这些响应可能包含特定的标记或格式,可以作为流量分析的依据。
-
加密或混淆的负载:蚁剑可能会加密或混淆其负载以避免检测,这可能表现为请求或响应中不寻常的二进制数据。
所以这题很明显就是蚁剑流量;
想了解更多流量特征推荐文章:Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉
所以这里的编码就是URL编码+base64编码混淆的,那我们继续分析看看到底传了个啥;
我比较喜欢看Length来分析(因为内容比较多的一般都会有点信息在里面),直接先丢进URL进行解码;
太乱了没关系,我们直接复制到txt里面进行分析,刚刚也说了是URL+base64,所以这里我们丢进base64在线解码试试看;(注意需要删除前面两个字符,要不然不能正常解码)
不难看出跟我之前想的一样传了个zip,那里面估计就是flag了,那我们继续返回刚刚导出的http的里面进行一个一个查找(这样比较便捷,就是有点枯燥);
终于的终于我们在导出的文件ma(19).php里面发现了zip,前面有一些多余的数据我们直接选中删除即可,保存并且后缀改zip退出;
打开发现需要密码,一开始选择爆破但是发现不行,后来想了想密码估计也是在流量包里面,尝试寻找一下;(还是Length最大的优先)
一个一个往下查(追踪http),还是接着上面的操作(复制红色区域到URL解码再进行base64解码),最后就发现zip的密码了;
URL解码;
base64解码;(注意还是像上面一样删除前两个字符,所有base64解码都需要删除,不然就是乱码)
所以zip密码:PaSsw0rd_LitCtF_L0vely_tanJi
右键打开方式选择记事本打开即可;
LitCTF{anTsw0rd_fl0w_is_eAsY_f0r_u}
9、The love
下载得到附件得到一张jpg图片、wav结尾音频;
先使用010简单分析一下图片,发现尾部很多PK字符,而且还发现了可疑字符,根据刷题经验猜测图片里有个zip,并且有锁,而这个密码需要我们自己使用掩码爆破出来;
Litctf???ftctiL
图片直接丢进kali进行分离,得到一个有锁的zip;(不出所料)
那我们直接尝试掩码爆破;
密码:Litctf202405ftctiL
我们打开zip,发现里面有一个flag.txt与password.txt;
flag不出意外就是没出意外也是假的,不过没关系我们还有一个wav音频没有开始分析;
既然是wav结尾并且现在我们有了password,盲猜一手工具deepsound或者silenteye;(wav音频隐写常用的)
简单尝试了一下,发现并不是silenteye隐写,那就deepsound,但是奇怪的是发生了,deepsound也没有;
实在没办法了,后来简单询问了一下师傅才发现确实是deepsound,但是注意!deepsound2.2才行;
不要慌我们使用base64进行解码得到:bG92ZV9pc19wYWluZnVs
然后你会发现是错的,因为这个不是最后编码还需要进行一次base64解码(至于为什么还是base64解码可以看一下base64编码的特征)
密码:love_is_painful
最后导出txt得到flag;
Litctf{wish_you_can_find_your_true_love}
二、CRYPTO
1、small_e
下载得到;
简单分析一下;
小明文攻击(Small Plaintext Attack)在RSA加密中,特别是针对低加密指数e=3
的情况。这种攻击利用了当加密指数e
很小,并且明文m
足够小以至于m^e < n
时,可以直接计算密文c
的e
次方根来恢复明文的情况。
为了实现这个目的,我们可以使用gmpy2
库的iroot
函数来尝试计算每个密文的立方根。这里是修改后的脚本,它尝试对给定的密文列表c_list
进行攻击,以恢复原始的明文消息:
脚本如下:
from Crypto.Util.number import long_to_bytes
import gmpy2
# 给定的RSA公钥参数和密文列表
n = 19041138093915757361446596917618836424321232810490087445558083446664894622882726613154205435993358657711781275735559409274819618824173042980556986038895407758062549819608054613307399838408867855623647751322414190174111523595370113664729594420259754806834656490417292174994337683676504327493103018506242963063671315605427867054873507720342850038307517016687659435974562024973531717274759193577450556292821410388268243304996720337394829726453680432751092955575512372582624694709289019402908986429709116441544332327738968785428501665254894444651547623008530708343210644814773933974042816703834571427534684321229977525229
c_list = [438976, 1157625, 1560896, 300763, 592704, 343000, 1860867, 1771561, 1367631, 1601613, 857375, 1225043, 1331000, 1367631, 1685159, 857375, 1295029, 857375, 1030301, 1442897, 1601613, 140608, 1259712, 857375, 970299, 1601613, 941192, 132651, 857375, 1481544, 1367631, 1367631, 1560896, 857375, 110592, 1061208, 857375, 1331000, 1953125]
flag = ""
for c in c_list:
# 计算密文c的立方根
m, exact = gmpy2.iroot(c, 3)
if exact:
flag += long_to_bytes(int(m)).decode()
else:
print("立方根不是完全的,可能需要检查其他解码方法。")
print(f"Recovered flag: {flag}")
简单分析一下这个脚本:
这个脚本假设每个密文c
对应的明文m
的立方是小于n
的,这样m^3 = c (mod n)
简化为m^3 = c
。这意味着可以直接计算c
的立方根来恢复m
。
这个脚本还假设每个明文字符单独加密,这是因为它尝试将每个密文的立方根转换回一个字符。这种方法在处理单个字符加密时有效,但如果原始明文是作为一个整体加密的,那么恢复明文的方法将会不同。
此外,exact
标志用于检测iroot
函数计算的立方根是否是精确的。如果不是,这可能意味着原始明文无法通过这种简单的立方根计算直接恢复。
LitCTF{you_know_m_equ4l_cub3_root_0f_n}
2、common_primes
下载附件得到:
分析:
当两个RSA公钥共享相同的模数(在这个例子中是p
),并且明文消息相同,就可以使用共模攻击(Common Modulus Attack)来恢复该消息。在脚本中,n1
和n2
不是共享相同的模数,因为它们分别是p*q1
和p*q2
的结果。不过,p
是两个模数的共同质因数。
共模攻击通常适用于n
相同,而e
不同的情况。对于这种情况,如果我们有两个密文c1
和c2
,它们使用相同的明文m
但不同的公钥(n, e1)
和(n, e2)
加密,我们可以找到一种方法来恢复m
。
然而,我们不能直接应用标准的共模攻击,因为n1
和n2
不同。不过,由于p
是n1
和n2
的共同质因数,如果我们能以某种方式找到p
,我们就能分别求解每个模数下的明文。
对于给定的n1
和n2
,如果我们知道它们共享一个质因数(在这个例子中是p
),我们可以使用最大公约数(GCD)算法来找到p
,因为gcd(n1, n2) = p
。然后,我们可以使用p
来分解每个模数,并使用标准的RSA解密过程来恢复明文。
脚本:
from Crypto.Util.number import *
import gmpy2
# 给定的n1, n2, c1, c2
n1 = 63306931765261881888912008095340470978772999620205174857271016152744820165330787864800482852578992473814976781143226630412780924144266471891939661312715157811674817013479316983665960087664430205713509995750877665395721635625035356901765881750073584848176491668327836527294900831898083545883834181689919776769
n2 = 73890412251808619164803968217212494551414786402702497903464017254263780569629065810640215252722102084753519255771619560056118922616964068426636691565703046691711267156442562144139650728482437040380743352597966331370286795249123105338283013032779352474246753386108510685224781299865560425114568893879804036573
c1 = 11273036722994861938281568979042367628277071611591846129102291159440871997302324919023708593105900105417528793646809809850626919594099479505740175853342947734943586940152981298688146019253712344529086852083823837309492466840942593843720630113494974454498664328412122979195932862028821524725158358036734514252
c2 = 42478690444030101869094906005321968598060849172551382502632480617775125215522908666432583017311390935937075283150967678500354031213909256982757457592610576392121713817693171520657833496635639026791597219755461854281419207606460025156812307819350960182028395013278964809309982264879773316952047848608898562420
# 计算p,因为gcd(n1, n2) = p
p = gmpy2.gcd(n1, n2)
# 由于n1 = p * q1,我们可以通过n1 / p来得到q1
q1 = n1 // p
# 确认e值
e = 65537
# 计算模n1下的私钥d1
phi_n1 = (p-1) * (q1-1)
d1 = gmpy2.invert(e, phi_n1)
# 使用d1对c1进行解密以恢复m
m = pow(c1, d1, n1)
# 将m转换回字节串
flag = long_to_bytes(m)
print(f"Recovered flag: {flag}")
注意,这个脚本假设我们只用n1
和c1
来恢复m
,因为我们已经找到了p
和q1
。同样的过程也可以应用于n2
和c2
。这个脚本的关键在于计算p
,这是通过计算n1
和n2
的最大公约数(GCD)实现的。一旦我们有了p
,就可以像处理标准RSA解密那样恢复明文。
LitCTF{c0mmunity_w1th_two_ciphert3xt}
3、CRT
下载附件打开;
简单分析一下:
根据题目名发现是中国剩余定理(CRT)攻击RSA加密系统,我们需要假设我们已经有了几个不同的模数n
和对应的密文c
。这些密文都是由同一个明文m
加密得到的,使用相同的指数e
。
脚本:
from sympy.ntheory.modular import crt
from gmpy2 import iroot
from Crypto.Util.number import long_to_bytes
# 已知的公钥指数
e = 10
# 已知的不同的模数和对应的密文
n_list = [16284549467215459860410219597024063610473673936290355100056351270928590364613988243842136274404316005691228851657707321037165033870804113001550943722154728825877813376691406849932899693973387282799799300076386870984605589385666352824740622229871992727011987847056429850720207816048044538068625281977059392365698031140268787802886018698622326103590834314940280191560618753408741810842189500991556860816195814550884416201667771827582907240044216817705876129993030771943110090291383205720587816820335839616491257078918258839986942101986011761809815192713499542329037877195448381127272183807358011340669666067708631770629, 18874449316683637715798227591079994715220250787784886038879393543606786017564740000007881151950098752600868917271951840433212429335449734520464340460962870875528399394278620757114832553403790578599857545045548782264680469899469733610229824411943119032419052885845035690046611519195843721184869834557481917675133504256150187042147269721516549831707784660343957497462516302534697915170087780048689613921549811073805796084838801677337285061667687328043565589734203160196445644144798845303226939960633632967262794622796927905511547760465906600293964201276584199569541295613430382495278352554280248372584117917520373403063, 13076908038170870040678205430512292701702182383746502395067907294908791921755288520053025319156015431312084703402938465525746196078114225446604200656116848235842943713613538425047483331236843707852400888407037547782069810250229035895403347555287877301409523248658733500963325361631821388259137561613536275954710848967383282290486421290937700396986650186236373076267188846407623991396459884128392118502565707689494271484411270172764553747426536404781904379621870642658609027074757591034785814602602669666257742808888301912575857074138613714693225934811254682687014167022418837710552784925328161453554291397460324648009, 16378397749449315054623854181248970586445531404081850673625192835136416152712968780451149412408644689393643801969477034418829482292894114547339155149570026460766659623960243723741437212596779580161767297321149670682427000047000712397718946486472118638780090056091542235702825736985864963592363421943353726975184567975451918105247987573044010599149673027905021130138957885113596669923366241161695565837122963976988635649640547443201925034845002113548522307980664206158188711548845245115694530280375848933481227411503982144621846732228815377656607983358898296200251680387871097014543693213877074718748683243193584032307, 16561385664507310659703460597815131331175620854125898893505075859155749890511144622913872488783791188180242785479319865960633526830814389031162024199864660323116594980719331106368397062852472114748955889862650270563487466194545102072373606964935390400328607060427961354290055443710114639781630071832997101380097322119243847190066266823291236828718017385537809056374392924015081117151158033309950857254309859691442649968222489177513517837849318096762149934959873646750864750378500351560253453052870424424427631414365680967482680769587570457938750679258205430151223470761518748987038822469422647137405393267829437115661, 27046459277694602448592524332290812177367631061914086306537115904955610821120392893033090428641088790759783810505225125618182431554899875183961418066959811832057748013953098277804562621152445358481976221983179988257658622392669474721482514871569548645762057681213193026792187879687736985533503283192537252904253565317763028483404018596514523171644666753183517320602643087213777450193062371986178076259168860180486748722567326484282893069173271762518110920685267104269429407229859993484209639764440874444582271870147714648808732931399985199947422716048582921727875237459841962093669408116061538502016560235135864203187, 26656304012303785684433399162699704691814095671158676770279115782799819097401667611247727555104978633884125246262630572285699884039990597392442760154412046297340436752418017863089245998557221143069544231044947583991838381529081774245290065442299808728542273138931461712874414662570197142795674160946728850452526786804787060582942714635903943088540232346797109678405554499677459722287119125623191067780196726820726456507802067342186435679967664032334075189916733352409403602499298544374351405005339596410771187606377781063995755795494682971576602822244457151090982442689870155439418641987576796032975032982289138437523, 15430339362720939092241771692575439580654810089653970198317149114896596238037181680990393763581287618371554846982066535980062263001619707606585504112155505335852802431392213092366756058196440934454810685146101829974548748060332228708229146991380736668433937967747468330692411917426038703359064546899782163287526256750039064809093426968389929333819191207284079703677535201724530391246890003928025687520199553868464322185815354591044585221486768114570373992719977614232251764409893171263639718616620216630797031237033969290978218328767317279717825174597882707772846934097838694418308236053838800414834627456689940059791, 18567217334857361786819913577261265078968886790989901098066320191741355103505838160569648197557648144402318678198622602821398215265062903833980611331991924162821902705417905758829862021425828310098183855605162264362860669298956185657733562472361876121183146316333113433547558152618165933865808900552444816088227098441082165477634812598644531670232452276788291537671779564658425789722419032860803991282640262179618723470437500425645011269733791887608702964571393657348573277992781115199432229176320688981128912052074722348557580462855962547978505669490105804175211061178124988260957275350940324541120102820024607088877, 10779265483116424102513175333888918968735912126282080716409998310381429332303237383487628664073567555863832134055945636657550074126628975203541323090803941066893475056319351674995896497450955897099614503220268400135112031310669044989879413178359759130908036871112663414065113664951350386824618325532532761206110118269005313068956882540007289422776225718534047101012876346009269097785027585782628699252006893938086064139042361425306202870627629615292450559291783382487842611805623198422252868756644595549320868144393828052610953995595915294930701560599016888539448223935199483656756326744914184772404419968728372785709] # 这里填入所有的n值
c_list = [644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049] # 这里填入所有的c值,与n_list对应
# 使用中国剩余定理计算一个整数,它在所有给定的模数下与每个密文同余
resultant, mod = crt(n_list, c_list)
# 尝试计算这个整数的e次方根,这个方根应该是原始消息m
value, is_perfect = iroot(resultant, e)
# 如果方根是完全的(即没有小数部分),则将整数m转换回字节串
if is_perfect:
flag = long_to_bytes(value)
print(f"Recovered flag: {flag.decode()}")
else:
print("The e-th root of the resultant is not an integer. Cannot recover the flag.")
脚本说明:
在这个脚本中,我们首先导入了所需的模块。我们使用crt
函数来解决一系列同余方程,并得到一个可能的m^e
值。然后,我们使用iroot
函数来尝试找到这个值的e
次方根,如果它存在的话。如果方根是完全的,我们就找到了明文m
,并将其转换为字节串以显示。如果方根不是完全的,那么我们无法恢复明文。
确保在运行此脚本之前已经安装了gmpy2
和pycryptodome
(提供Crypto.Util.number
模块)库。如果没有安装,可以使用pip进行安装:
pip install gmpy2 pycryptodome
我这个脚本有点复杂不易理解,大家感兴趣的可以去公主主页看看;
最后:
LitCTF{CRT_i5_s0_e4sy!!!}
4、little_fermat
下载附件打开:
简单分析一下;
这题考察邻近素数和明文预处理,我们可以写一个脚本来恢复由两个邻近素数p
和q
加密的RSA明文。这个脚本将首先尝试找到p
和q
,然后计算私钥d
,最后解密密文c
并恢复原始明文。
脚本:(参考公主文章)
from Crypto.Util.number import *
from gmpy2 import *
# 假设的n和c值,这里应该用实际的n和c值替换
n = 122719648746679660211272134136414102389555796575857405114496972248651220892565781331814993584484991300852578490929023084395318478514528533234617759712503439058334479192297581245539902950267201362675602085964421659147977335779128546965068649265419736053467523009673037723382969371523663674759921589944204926693
c = 109215817118156917306151535199288935588358410885541150319309172366532983941498151858496142368333375769194040807735053625645757204569614999883828047720427480384683375435683833780686557341909400842874816853528007258975117265789241663068590445878241153205106444357554372566670436865722966668420239234530554168928
e = 65537
# 计算n的平方根并找到邻近的素数作为q
sqrt_n = isqrt(n)
q = next_prime(sqrt_n)
# 由于p和q是邻近素数,我们可以通过n除以q来找到p
p = n // q
# 确保我们找到了正确的p和q
assert p * q == n
# 计算私钥d
phi = (p - 1) * (q - 1)
d = invert(e, phi)
# 解密得到m
m = pow(c, d, n)
# 由于明文m在加密前与x进行了异或操作,我们需要找到x
# 在这个场景中,x是p-1
x = p - 1
# 恢复原始明文
original_m = m ^ x
# 将明文转换为字节串
flag = long_to_bytes(original_m)
print(f"Recovered flag: {flag.decode()}")
简单分析一下:
这个脚本是针对一个特定的RSA加密场景编写的,其中两个素数p
和q
非常接近,且明文m
在加密前与p-1
进行了异或操作。以下是脚本的逐步分析:
-
确定模数
n
和密文c
:脚本开始于给定的模数n
和密文c
。这两个值是RSA加密过程的输出,其中n
是公钥的一部分,c
是加密后的消息。 -
计算
n
的平方根:使用isqrt(n)
计算n
的整数平方根。由于p
和q
是邻近素数,n
的平方根会非常接近p
和q
。 -
寻找邻近素数
q
:利用next_prime(sqrt_n)
找到sqrt_n
的下一个素数,作为q
。这一步假设q
比p
稍大,且两者非常接近。 -
计算
p
:通过整数除法n // q
计算p
。由于n = p * q
,这个操作能够准确找到p
。 -
验证
p
和q
:通过断言p * q == n
来验证找到的p
和q
是否正确。这是一个简单的完整性检查,确保后续步骤的正确性。 -
计算私钥
d
:首先计算欧拉函数phi = (p - 1) * (q - 1)
,然后使用模逆函数invert(e, phi)
计算私钥d
。这里的e
是公钥指数,通常是一个公开知道的值(本例中为65537)。 -
解密密文
c
:使用私钥d
和模数n
对密文c
进行解密,得到m = pow(c, d, n)
。这一步恢复了加密前对明文进行异或操作的结果。 -
恢复原始明文:由于明文在加密前与
p-1
进行了异或操作,我们需要再次执行这个异或操作来恢复原始明文:original_m = m ^ x
,其中x = p - 1
。 -
转换和打印明文:将恢复的明文
original_m
从长整数转换为字节串,然后解码(假设为UTF-8或其他适当的编码)并打印出来。
总结:这个脚本展示了如何在特定条件下,即使用邻近素数和明文预处理(异或操作),逆转RSA加密过程。
LitCTF{Y0u_know_littl3_ferm4t_th3ory}
5、真·EasyRSA
下载附件;
一开始想尝试分解n,但是发现不管怎么分解都是它本身,那没有办法我们只能换一种思路;
那我们直接参考公主文章吧!
直接上脚本;
# 导入Crypto.Util.number库,提供了一些处理大整数的实用工具函数
# 导入gmpy2库和iroot函数,用于进行大整数运算和计算整数的n次方根
from Crypto.Util.number import *
import gmpy2
from gmpy2 import iroot
# 定义公钥指数e,这是RSA加密中常用的公钥指数
e=65537
# 定义两个密文c1和c2
c1= 78995097464505692833175221336110444691706720784642201874318792576886638370795877665241433503242322048462220941850261103929220636367258375223629313880314757819288233877871049903331061261182932603536690216472460424869498053787147893179733302705430645181983825884645791816106080546937178721898460776392249707560
c2= 3784701757181065428915597927276042180461070890549646164035543821266506371502690247347168340234933318004928718562990468281285421981157783991138077081303219
# 定义模数n
n = 111880903302112599361822243412777826052651261464069603671228695119729911614927471127031113870129416452329155262786735889603893196627646342615137280714187446627292465966881136599942375394018828846001863354234047074224843640145067337664994314496776439054625605421747689126816804916163793264559188427704647589521
# 计算模数n的四次方根p,得到原始的质数
p = iroot(n,4)[0]
# 计算欧拉函数phi,它是p的四次方减p的三次方
phi = p**4 - p**3
# 使用欧拉函数phi和公钥指数e,计算私钥指数d,d是e关于phi的模逆元
d = gmpy2.invert(e,phi)
# 使用私钥指数d和模数n,对密文c1进行解密,得到明文m
m = pow(c1,d,n)
# 打印解密后的明文m
print(long_to_bytes(m))
脚本分析:
这个脚本首先定义了一些变量,包括公钥指数e和两个密文c1和c2,以及模数n。然后,计算模数n的四次方根p,得到原始的质数。欧拉函数phi被计算为p的四次方减p的三次方。接着,使用phi和e计算私钥指数d。最后,使用d和n对c1进行解密,得到明文m。(不得不说公主真的RSA真的很强捏~)
运行得到:(没错是假的flag)
b'LitCTF{HeRe_1s_Weak_F1aG}hahahaha_____hint_is_93492332457019255141294502555555489582661562346262162342211605562996217352449'
但是不要慌,跟着公主的步伐,那既然这里也得到了hint,所以我们可以尝试解c2;
附上完整脚本(解析在底下)
# 导入必要的库
from Crypto.Util.number import *
import gmpy2
from gmpy2 import iroot
# 定义公钥指数
e=65537
# 定义两个密文
c1= 78995097464505692833175221336110444691706720784642201874318792576886638370795877665241433503242322048462220941850261103929220636367258375223629313880314757819288233877871049903331061261182932603536690216472460424869498053787147893179733302705430645181983825884645791816106080546937178721898460776392249707560
c2= 3784701757181065428915597927276042180461070890549646164035543821266506371502690247347168340234933318004928718562990468281285421981157783991138077081303219
# 定义模数
n = 111880903302112599361822243412777826052651261464069603671228695119729911614927471127031113870129416452329155262786735889603893196627646342615137280714187446627292465966881136599942375394018828846001863354234047074224843640145067337664994314496776439054625605421747689126816804916163793264559188427704647589521
# 计算模数 n 的四次方根 p,得到原始的质数
p = iroot(n,4)[0]
# 计算欧拉函数 phi,它是 p 的四次方减去 p 的三次方
phi = p**4 - p**3
# 使用欧拉函数 phi 和公钥指数 e,计算出私钥指数 d,d 是 e 关于 phi 的模逆元
d = gmpy2.invert(e,phi)
# 使用私钥指数 d 和模数 n,对密文 c1 进行解密,得到明文 m
m = pow(c1,d,n)
# 打印出解密后的明文 m,这是一个假的 flag
print(long_to_bytes(m))
# 根据假的 flag 提示,我们知道 p 是一个特定的数值。我们使用这个新的 p 值重新计算解密指数 d
p = 93492332457019255141294502555555489582661562346262162342211605562996217352449
# 使用新的 p 值和 e 计算新的解密指数 d
d = gmpy2.invert(e,(p-1))
# 使用新的解密指数 d 和新的 p 值,对密文 c2 进行解密,得到最终的明文 m
m = pow(c2,d,p)
# 打印出解密后的明文 m,这是最终的正确的 flag
print(long_to_bytes(m))
简单分析:
脚本使用 RSA 算法解密了两个密文。首先,它使用公钥指数 e 和模数 n 解密了密文 c1,得到了一个假的 flag。然后,它使用一个来自假 flag 的提示重新计算了私钥指数 d,并解密了密文 c2,得到了最终的正确的 flag。
最后运行得到;
LitCTF{R1ght_Answ3r!}
三、REVERSE
1、编码喵
下载附件
简单分析一下:无壳,64位;
进去直接找到主函数main,F5反编译即可;
tgL0q1rgEZaZmdm0zwq4lweYzgeTngfHnI1ImMm5ltaXywnLowuYnJmWmx0=
接着我们只要找到对应的码表逆回去即可;
简单分析一下发现在函数——text_72(双击)
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/
LitCTF{03034ed8-a2da-4aa6-b2c9-01ace9e26301}
2、hello_upx
下载附件查壳,发现upx,丢进kali去壳;
发现去壳失败,那我们使用010打开exe查看upx标志位;
修改完成,继续去壳;
使用64ida打开;
简单分析一下;
-
变量初始化:
v4[3]
:一个64位整数数组,用来存储加密或变换后的目标字符串的值。v5
:一个16位整数,其作用在这个程序片段中并不明确。v6[40]
:一个字符数组,用以接收用户输入的字符串。v7
:一个整型标志,用来指示用户输入的字符串是否通过验证。i
:循环计数器。
-
接收用户输入:
- 程序输出欢迎信息,提示用户输入flag。
- 使用
scanf
函数读取用户输入的字符串到v6
数组。
-
字符串处理:
- 第一个循环对
v6
中的每个字符进行处理,即每个字符减去其索引值。这是一种简单的字符串变换操作。
- 第一个循环对
-
验证处理后的字符串:
- 第二个循环将处理后的字符串与
v4
数组中的值进行逐字符比较。如果发现不匹配的字符,v7
被设置为0,表示验证失败。
- 第二个循环将处理后的字符串与
-
输出验证结果:
- 如果
v7
保持为1,即所有字符都匹配,程序将输出成功消息(尽管代码中aGood
未定义,所以我们不知道确切的成功消息内容)。 - 如果
v7
为0,即存在不匹配的字符,程序将输出“nononononno!”。
- 如果
所以很简洁明了,我们只需要逆向V4数组即可;
中间仅仅只做了ASCll加减操作,反着来即可;
脚本:
# 定义一个名为ABC的数组,包含加密后的ASCII值
ABC = [
0x4C, 0x68, 0x72, 0x40, 0x50, 0x41, 0x75, 0x70,
0x2B, 0x63, 0x59, 0x25, 0x61, 0x58, 0x51, 0x65,
0x20, 0x4E, 0x5A, 0x1E, 0x60, 0x4E, 0x5E, 0x4F, 101
]
# 初始化空字符串用于存储解密的flag
flag = ''
# 遍历ABC数组中的每个元素
for i in range(len(ABC)):
# 对每个元素执行逆向操作:将元素值加上其索引
# 这是因为原始加密过程中,每个字符减去了其索引值
# 使用chr()函数将结果转换为对应的ASCII字符
flag += chr(ABC[i] + i)
# 打印解密后的flag
print(flag)
这里加了注释就不做过多解释;
LitCTF{w3lc0me_t0_l1tctf}
3、ezpython!!!!!
下载附件根据提示,已知需要提取pyc;
百度一下发现需要pyinstxtractor提取
提取命令;
python pyinstxtractor.py ezpy.exe
发现这里有提示说《请在 Python 3.11 中运行此脚本,以防止解组期间出现解压缩错误》;
那就切换python 3.11运行呗;
[Python 3.11官网下载](Python 版本 Python 3.11.0 |Python.org)
配置好环境变量简单切换一下即可;
打开提取出的ezpy.exe_extracted文件,找到ezpy.pyc进行反编译(这里注意反编译的也是需要Python 3.11的噢~)
X=3o4hx=0EZwf=mMv13gX=3o4hx=qje2ZjtgZQmEKXZog4==
很明显是进行了base64编码那我们逆回去就行,现在就只要找到它对应的码表即可,可以看出导入了自定义的库;
发现base64不止一个不知道哪一个,那没事我们一个一个进行分析就行;
最后在Litctfbase64.pyc发现码表;
8kuWYm=1JiUPs7DT4x+X5tcqZKfGvA0gFLB6y3QbV2rNOlRdMwnEohjzSe9/HIa-
最后;
LitCTF{61happy_LitCTF_nice_base64}