GKCTF(MISC&CRYPTO部分)(未完待续。。)

写在前面:

嘎嘎,又是被比赛虐的一天(连续虐了三天呜呜呜,安恒月赛等等在写嘎嘎)

部分wp,剩下的一题目前还不会,这次可能会标未完待续嘎嘎

crypto

0x01小学生的密码学

嘎,看到题目描述

e(x)=11x+6(mod26) 密文:welcylk (flag为base64形式)

果然是我们小学二年级就能一眼看出的仿射密码呢(才不是嘞,要不是我之前见过,我可能就在这题挂掉了)

话不多说,直接上脚本(小声bb:我感jio看看加密原理可以手撕~)

def affine(a,b):
	pwd = {}
	for i in range(26):
		pwd_dic[chr(((a*i+b)%26+97))] = chr(i+97)
	return pwd_dic

if __name__ == '__main__':
	pwd_dic = {}
	pwd = 'welcylk'
	pwd = pwd.lower()
	plain = []
	pwd_dic = affine(11,+6)
	for i in pwd:
		plain.append(pwd_dic[i])
	print ("Flag is :" + "".join(plain))

所以结果是 sorcery 啦
然后base64加密

flag{c29yY2VyeQ==}

over

0x02汉字的秘密

所以暂时将你眼睛闭了起来~

(不知道为什么写wp一直重复这句歌词)

扯回正题啊喂,以上与本题无关嘎嘎

得到题目是几个汉字,如下:

王壮 夫工 王中 王夫 由由井 井人 夫中 夫夫 井王 土土 夫由 土夫 井中 士夫 王工 王人 土由 由口夫

啊~回想见过的密码与汉字有关的就是当铺加密啦

他的精髓就是汉字笔画的出头数,所以什么汉字都无所谓啦(画个重点嘎)

根据本题所给的汉字,我们得到如下数字串

69 74 62 67 118 83 72 77 86 55 71 57 82 57 64 63 51 107

看着是不是很像ASCII嘎嘎?

嘿嘿,它当然是ASCII码啦

EJ>CvSHMV7G9R9@?3k

但是是不是找出来什么规律?

别急,我们仔细观察

你看前四个数字是不是跟flag的ASCII码有关系!!

经过我们仔细思考,得到如下规律

i=i+1,原来的ASCII+他所在的位置就是他代表的真实的字母啦

(说白了就是变异凯撒)

(真的好不专业啊喂)

flag{you_are_good}

bingo(^_-)

0x03babycrypto

嘎嘎,本题是在chrisyy师傅的指导下做出来的~在此膜一下密码学爷爷

(脚本也是来自chrisyy师傅哒)(附上密码学爷爷的博客嘎嘎http://blog.chrisyy.top/

题目如下,感受一下绝望

这个n根本就分解不出来,有619位(╭(╯^╰)╮)

# n:0xb119849bc4523e49c6c038a509a74cda628d4ca0e4d0f28e677d57f3c3c7d0d876ef07d7581fe05a060546fedd7d061d3bc70d679b6c5dd9bc66c5bdad8f2ef898b1e785496c4989daf716a1c89d5c174da494eee7061bcb6d52cafa337fc2a7bba42c918bbd3104dff62ecc9d3704a455a6ce282de0d8129e26c840734ffd302bec5f0a66e0e6d00b5c50fa57c546cff9d7e6a978db77997082b4cb927df9847dfffef55138cb946c62c9f09b968033745b5b6868338c64819a8e92a827265f9abd409359a9471d8c3a2631b80e5b462ba42336717700998ff38536c2436e24ac19228cd2d7a909ead1a8494ff6c3a7151e888e115b68cc6a7a8c6cf8a6c005L
# e:65537
# enc:1422566584480199878714663051468143513667934216213366733442059106529451931078271460363335887054199577950679102659270179475911101747625120544429262334214483688332111552004535828182425152965223599160129610990036911146029170033592055768983427904835395850414634659565092191460875900237711597421272312032796440948509724492027247376113218678183443222364531669985128032971256792532015051829041230203814090194611041172775368357197854451201260927117792277559690205342515437625417792867692280849139537687763919269337822899746924269847694138899165820004160319118749298031065800530869562704671435709578921901495688124042302500361
# p>>128<<128:0xe4e4b390c1d201dae2c00a4669c0865cc5767bc444f5d310f3cfc75872d96feb89e556972c99ae20753e3314240a52df5dccd076a47c6b5d11b531b92d901b2b512aeb0b263bbfd624fe3d52e5e238beeb581ebe012b2f176a4ffd1e0d2aa8c4d3a2656573b727d4d3136513a931428b00000000000000000000000000000000Lnhenda 

首先看到n很大,那么这道题肯定就不是通过分解n来做题
再看p是给了部分高位p(这个一定不是最终的p,因为他不是质数,为什么不是质数,因为转成十进制可以整除5嘎嘎)

所以这道题是用Coppersmith定理来做题嘎嘎

那么~接下来进入做题时间

脚本如下,能看懂的师傅可以多看两眼,看不懂的师傅(比如我,知道如何把数带进去就好嘎嘎)跳过代码看下面

from Crypto.Util.number import *
n = 0xb119849bc4523e49c6c038a509a74cda628d4ca0e4d0f28e677d57f3c3c7d0d876ef07d7581fe05a060546fedd7d061d3bc70d679b6c5dd9bc66c5bdad8f2ef898b1e785496c4989daf716a1c89d5c174da494eee7061bcb6d52cafa337fc2a7bba42c918bbd3104dff62ecc9d3704a455a6ce282de0d8129e26c840734ffd302bec5f0a66e0e6d00b5c50fa57c546cff9d7e6a978db77997082b4cb927df9847dfffef55138cb946c62c9f09b968033745b5b6868338c64819a8e92a827265f9abd409359a9471d8c3a2631b80e5b462ba42336717700998ff38536c2436e24ac19228cd2d7a909ead1a8494ff6c3a7151e888e115b68cc6a7a8c6cf8a6c005L
e = 65537
c = 1422566584480199878714663051468143513667934216213366733442059106529451931078271460363335887054199577950679102659270179475911101747625120544429262334214483688332111552004535828182425152965223599160129610990036911146029170033592055768983427904835395850414634659565092191460875900237711597421272312032796440948509724492027247376113218678183443222364531669985128032971256792532015051829041230203814090194611041172775368357197854451201260927117792277559690205342515437625417792867692280849139537687763919269337822899746924269847694138899165820004160319118749298031065800530869562704671435709578921901495688124042302500361
high_p = 0xe4e4b390c1d201dae2c00a4669c0865cc5767bc444f5d310f3cfc75872d96feb89e556972c99ae20753e3314240a52df5dccd076a47c6b5d11b531b92d901b2b512aeb0b263bbfd624fe3d52e5e238beeb581ebe012b2f176a4ffd1e0d2aa8c4d3a2656573b727d4d3136513a931428b00000000000000000000000000000000L

R.<x> = PolynomialRing(Zmod(n), implementation='NTL')
p = high_p + x
x0 = p.small_roots(X = 2^128, beta = 0.1)[0]

P = int(p(x0))
Q = n // P

assert n == P*Q
d = inverse_mod(65537, (P-1)*(Q-1))
print(long_to_bytes(power_mod(c, d, n)))

重点来咯!!!这个脚本要在sage下运行
下载sage(大概七百八M)解压安装,

双击notebook(这个得在跑脚本的时候一直开着)

会自动跳出来一个home的网页,

在右上角新建sage,将脚本直接贴进去,运行就好啦(如果你还没有看懂的话,欢迎私聊嘎嘎)

所以最后flag是

flag{3d0914a1-1e97-4822-a745-c7e20c5179b9}

over嘎嘎

Misc

0x01签到题

打开链接即可得到flag

开胃菜,没啥好写的,忘记截图了(主要是每次都是习惯赛后写wp,老是忘记记录解题步骤

大概flag就是flag{xxx_xxx_xxx}

嘎(皮一下很开心)

0x02Pokeman

精灵宝可梦,来一段回忆杀吧

拿到题目是份游戏说明和一个gba文件,啊,百度一下gba,发现是任天堂公司的游戏

(这里根据题目提示也可知是精灵宝可梦这款游戏)

打开的话需要用到模拟器——VisualBoyAdvance(1.8CN)

https://dl.3dmgame.com/patch/147353.html(模拟器下载地址)

然后载入文件,一直向下就好 嘎嘎,疯狂按Z,

去到野外去到103道路即可成功get到flag(题目描述啦)
图片

最后flag是flag{PokEmon_14_CutE}

嘎over

0x03 Harley Quinn

啊,题目给了一段音频和一张图片

做题后期还给了两个hint

hint1:电话音&九宫格

hint2:FreeFileCamouflage,下载的文件可能显示乱码

我拿到题目的思路是先看了看图片,发现最后有一段类似base64编码的东西存在,但是解码发现并不是那么简单。在其他方面并没有找到有价值的线索,于是我们继而分析音频

音频的话就简单直接了当多了,前面没什么特别,听到最后发现有dtmf音

看了看就几个,然后题目提示说工具提取dtmf音可能会有乱码,所以这里我是用的手工提取嘎嘎

手工提取方法请看第一篇博客——MRCTF的misc第三题寻找xxx 嘎

图片

手工分析的结果是

#222833344477773338866#

这时我们看第一条hint,电话拨号+九宫格,

九宫格就很明显的拼音九键啦

即 ctfisfun

这时我们并没有获得需要下一步的线索,这里我们合理猜测是个密钥嘎嘎

但是我们目前还没有获得一个需要密钥的文件,而且图片我们还没有用到

这个时候第二个hint放出来了,是一个工具FreeFileCamouflage

题目也有提示说解密版本是1.25,

于是我们去百度这个工具的1.25版本,下载,启动

加载图片试一试,发现需要密钥,正好我们之前刚刚得到新鲜出炉的密钥

正正好产生了一个名为flag.txt的文件嘎

开心心,成功得到flag

flag{Pudd1n!!_y0u_F1nd_m3!}

0x04code obfuscation

咔咔咔,重点来喽

下载附件得到一个被人玩坏了的二维码

图片

看到这个亚子不要慌,打开我们的神器——PS,直接暴力修图CfjxaPF

(因为扫码的时候是有纠错哒,所以粗糙一点也没什么)

(害,成大事者就要不拘小节嘎)

下面我们说一说PS修图方法(从不p图的手残人士在线教人——你,敢学吗?)

沙雕完了来说正事

先用截图(专业点就是裁剪工具)中的不规则截图(专业点来说叫透视裁剪工具)给他盘成大差不离的正方形,然后掏出我们的画笔工具,把他该是黑色的全都给他涂成黑色

图片

嘎,我真是个鬼才

扫码得到base(gkctf)

提交发现并不是真的flag,所以这道题还没有结束

遇事不决就看binwalk嘎

扔Kali里分离一下

(这里我试的时候foremost并不会出来压缩包,但是binwalk -e可以)

(binwalk -e 命令在我的2019版本的Kali也不会出来文件夹,在Kali2020版本才可以)

或者像我一样懒得开虚拟机,放010里发现图片最后有个rar压缩包,

(那么这里插播一个小白问题,如何发现图片最后有压缩包?

我们都知道png图片文件十六进制

开头是89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52(大概就是PNG.........IHDR)

结尾是49 45 4E 44 AE 42 60 82(大概是IEND)

那么多出的部分就是不属于原图片文件中的部分,不属于图片文件那是什么文件呢?

rar文件开头是52 61 72 21(开头是Rar样式)
所以判断图片后面还有一个压缩包文件。
over)

我们直接新建十六进制文件,将图片多余部分复制粘贴到新的十六进制文件里,另存为rar文件就OK啦

双击打开发现有密码,想到之前扫码得到的结果,输入并不对,看到base想到应该是吧gkctf加密后填入的吧

然后就在base家族里尝试

(附:base家族:16,32,58,64,85,91)

(欢迎各位路过大佬补充base家族成员嘎)

在尝试了平常常用的base16,32,64无果后,开始尝试base58,加密后密码为CfjxaPF

发现果真是压缩包密码。

(小声bb,我感觉这个密码也可以爆出来哦,如果实在修不了二维码的话

但是可惜的是我没有成功(/头秃.jpg)可能是工具的问题吧)

解压压缩包后得到一个1文件和一个flag3.jpg的图片

(说实话到这一步我以为有四层加密呢,害)

图片内容是一串串奇奇怪怪的文字
图片
分析图片也没有得到什么结果,嗯,那我们看一看另一个文件

用sublime打开后发现是js混淆(别问,问就是经验)

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('15 n 14 a b c d e f g h i j k l m n o p q r s t u v w x y z 10 11 17="n"12 15 n 14 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 10 11 17="n"12 13=0 15 n 14 a b c d e f g h i j 10 11 16="n"13=$((13+1))12 1g("1f=\' \';1e=\'"\';16=\'#\';1j=\'(\';1i=\')\';1h=\'.\';1a=\';\';19=\'<\';18=\'>\';1d=\'1c\';1b=\'{\';1k=\'}\';1t=\'0\';1u=\'1\';1s=\'2\';1r=\'3\';1n=\'4\';1m=\'5\';1l=\'6\';1q=\'7\';1p=\'8\';1o=\'9\';")',62,93,'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||do|eval|done|num|in|for|Bn|An|Ce|Cc|Cb|Cn|_|Cl|Bm|Bk|alert|By|Bt|Bs|Cp|Dg|Df|De|Dj|Di|Dh|Dd|Dc|Da|Db'.split('|'),0,{}))

用在线网站反混淆一下下
(这里提供一个在线网站https://www.jisuan.mobi/p6Hm3bB1Bbm66xiS.html

实话说,感觉还挺好用)

for n in a b c d e f g h i j k l m n o p q r s t u v w x y z do eval An = "n"
done
for n in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z do eval An = "n"
done
num = 0
for n in a b c d e f g h i j do eval Bn = "n"
num =
$((num + 1)) done alert("Bk=' ';Bm='"
 ';Bn='#
 ';Bs=' (';Bt=')
 ';By='.
 ';Cb=';
 ';Cc=' < ';Ce=' > ';Cl='
 _ ';Cn=' {
  ';Cp='
 }
 ';Da='
 0 ';Db='
 1 ';Dc='
 2 ';Dd='
 3 ';De='
 4 ';Df='
 5 ';Dg='
 6 ';Dh='
 7 ';Di='
 8 ';Dj='
 9 ';")

分析代码得上面一串串代码意思就是Bk=空格,Cb=;,Da=0,Aa=a这个样子
所以对照上面代码将图片代表内容写出来就好啦

#include <stdio.h>
int main(){
print('w3lc0me_4o_9kct5');
return 0;
}

所以最后flag就是
flag{w3lc0me_4o_9kct5}

over嘎

0x05Sail a boat down the river

这个目前还没复盘,先鸽这

嘿嘿,未完待续。。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值