前言
hgame开赛了,第一周的题比较简单,解了大部分非二进制和少部分二进制,估计第二周就不好过了。
CRYPTO
Dancing Line
给了张图片,里面是弯弯曲曲的线:
以右上角的黑色像素点为开头,每个像素下一位向右走则取0,向左走则取1,提取二进制码:
1 | 01101000 01100111 01100001 01101101 01100101 01111011 01000100 01100001 01101110 01100011 00110001 01101110 01100111 01011111 01001100 00110001 01101110 01100101 01011111 00110001 00110101 01011111 01100110 01110101 01101110 00101100 01011111 00110001 00110101 01101110 00100111 01110100 01011111 00110001 01110100 00111111 01111101 |
然后转成字符就是flag了:
Easy RSA
分析代码:
1 | from math import gcd |
随机获取两个质数,然后获取一个范围在0到n之间,并与phi互质的e,并且返回e, p, q, pow(ord(c), e, p * q)。根据分析,我们编写脚本:
1 | import libnum |
获取flag:
Matryoshka
密码套娃,一开始给的是盲文,查询转化表:
发现转化出来摩尔斯密码:
1 | ..-/--.../--..--/-----/--.../--..--/---../...--/--..--/.-../....-/--..--/..---/....-/--..--/..---/--.../--..--/.-.-/-..../--..--/...-/....-/--..--/....-/--.../--..--/---../...../--..--/---../--.../--..--/...-/-..../--..--/---../...--/--..--/.----/--.../--..--/--.../...--/--..--/...-/....-/--..--/-./....-/--..--/----./--.../--..--/--.../...../--..--/..-/-..../--..--/.-../....-/--..--/.----/--.../--..--/./-..../--..--/----./...../--..--/---../...--/--..--/.----/--.../--..--/..-/....-/--..--/...-/....-/--..--/.----/...--/--..--/.-.-/....-/--..--/--.../...../--..--/-..../....-/--..--/--.../....-/--..--/-----/--.../--..--/./-..../--..--/.----/....-/--..--/-..../--.../--..--/-----/...--/--..--/---../--.../--..--/..---/...../--..--/....-/--.../--..--/.-.-/-..../--..--/-..../...--/--..--/.----/...../--..--/.----/....-/--..--/--.../...--/--..--/--.../--.../--..--/-..../-..../--..--/....-/--.../--..--/--.../...--/--..--/.-.-/-..../--..--/..-/....-/--..--/./....-/--..--/....-/-..../--..--/...../-..../--..--/....-/....-/--..--/...../...--/--..--/---../-..../--..--/....-/....-/--..--/....-/-.... |
但是直接解密后无法继续解密,尝试逆序摩尔斯码,编写脚本:
1 | def strReverse(strDemo): |
结果:
1 | ....-/-..../--..--/-..../-..../--..--/....-/..---/--..--/--.../...../--..--/-..../-..../--..--/....-/...../--..--/....-/-..../--..--/-...././--..--/-..../-../--..--/....-/-.-./--..--/--.../...--/--..--/...--/-..../--..--/....-/....-/--..--/...--/...--/--..--/--.../...--/--..--/-..../----./--..--/...../----./--..--/--.../....-/--..--/....-/-.-./--..--/...--/-..../--..--/...../---../--..--/...--/..---/--..--/--.../-----/--..--/...--/....-/--..--/-..../----./--..--/....-/./--..--/...--/-----/--..--/-..../...--/--..--/-..../....-/--..--/...../...--/--..--/-..../-.-./--..--/--.../----./--..--/-..../-.../--..--/-..../-../--..--/...--/----./--..--/--.../..---/--..--/...../.----/--..--/....-/./--..--/...--/----./--..--/-..../..-./--..--/....-/-../--..--/...../...--/--..--/...--/.----/--..--/-..../.-/--..--/-..../-.../--..--/--.../...--/--..--/...--/----./--..--/--.../..---/--..--/....-/-.../--..--/...--/..---/--..--/...../..---/--..--/...--/-..../--..--/-..../-.../--..--/....-/-.-./--..--/...--/---../--..--/-..../---../--..--/-..../..-./--..--/--.../..---/--..--/...--/-----/--..--/...--/-.. |
解密得到:
1 | 46,66,42,75,66,45,46,6E,6D,4C,73,36,44,33,73,69,59,74,4C,36,58,32,70,34,69,4E,30,63,64,53,6C,79,6B,6D,39,72,51,4E,39,6F,4D,53,31,6A,6B,73,39,72,4B,32,52,36,6B,4C,38,68,6F,72,30,3D |
发现是十六进制码,转化字符串:
1 | FfBufEFnmLs6D3siYtL6X2p4iN0cdSlykm9rQN9oMS1jks9rK2R6kL8hor0= |
疑似base64码,但不能直接转换,提示有说明凯撒以及维吉尼亚,经过反复尝试应该是维吉尼亚密码,密钥为hgame:
1 | YzBibXZnaHl6X3swUmF6X2d4eG0wdGhrem9fMG9iMG1fdm9rY2N6dF8hcn0= |
base64解得:
1 | c0bmvghyz_{0Raz_gxxm0thkzo_0ob0m_vokcczt_!r} |
这里再跑一次凯撒,位数为21:
1 | h0gralmde_{0Wfe_lccr0ympet_0tg0r_atphhey_!w} |
观察得到应该先取奇数位,再取偶数位,解得flag:
1 | hgame{Welc0me_t0_the_w0rld_0f_crypt0graphy!} |
English Novel
附件给了很多东西,首先我们来看encrypt.py文件:
1 | def encrypt(data, key): |
分析逻辑,如果为大写或小写字母,则凯撒位移key位,否则不位移。那么flag.enc中的密文应该也是由这个逻辑得到的。接着我们要对比小说的明文与密文,算出对应的key值,但是由于part被打乱了,因此要找出对应的文件,一番查找找到明文的part0与密文的part175对应。
接着我们写脚本计算key值并解出flag,注意换行符也是要占一位的,脚本中我用空格代替:
1 | str1=' read: "\'Alfred Simmonds, Horse Slaughterer and Glue Boiler, Willingdon. Dealer in Hides and Bone-Meal. Kennels Supplied.\' Do you not understand what that means? They are taking Boxer to the knacker\'s!"A cry of horror burst from all the animals. At this moment the man on the box whipped up his horses and the van moved out of the yard at a smart trot. All the animals followed, crying out at the tops of thei' |
要注意,由于有部分位是非字母字符,因此那些位的key无法计算,所以我们跑出来的flag也不是最终flag:
不过这个flag还是比较好猜的,“你知道‘明文攻击’吗?”,因此得出flag:
1 | hgame{D0_y0u_kn0w_'Kn0wn-pla1ntext_attack'?} |
IoT
第一周IoT就一题,还是纯送分。直接把文件拖入IDA就能找到flag了:
MISC
欢迎欢迎!热烈欢迎!
签到题。
这个压缩包有点麻烦
附件给了一个压缩包,首先提示我们6位密码,因此直接爆破:
接着给了第二个压缩包,一个提示和一个字典,根据提示这里是字典爆破:
接着给了第三个压缩包和一个文件,比较发现这个文件和第三个压缩包中的文件一致,因此是明文破解:
接着打开是一张图片,binwalk发现藏有压缩包,因此进行分离:
这个压缩包中只有一张加密的图片,因此猜测伪加密,更改hex,成功获取flag图片:
好康的流量
打开流量包直接追踪TCP流,发现base64表示的图片:
通过base64获取图片,可以利用这个网站:
base64转图片
接着把图扔进stegslove中,在其中一个通道发现条形码,扫描条形码获取一半flag:
在流量包中解base64码可以得到LSB的提示,也可以直接猜,另一半flag就藏在LSB中:
组合成flag:
1 | hgame{ez_1mg_Steg4n0graphy} |
群青(其实是幽灵东京)
下载附件是一段音频,幽灵东京是真的好听,查看属性发现提示:
把音频放在SilentEye中解密但是没有解出来,猜测需要密码,查看音频的波形图找到密码并成功解密:
进入链接下载第二个附件,名字叫sstv,百度搜索一下发现是慢扫描电视,在手机上下载robot36,打开软件播放音频得到图片,扫描二维码即可得到flag:
PWN
test_your_nc
出题人煞费苦心就为了送我们这1分,太感动了,直接监听就行了:
REVERSE
easyasm
听队友说这题和安卓逆向都很简单,我就去做了。这题要我们生啃汇编搞懂逻辑,先看代码:
审计代码,逻辑就是将我们输入的字符左移4位的值与右移四位的值相加,再与0x17做一次异或,并将这个字符与上面那张图的十六进制比较,每一位都相等就输出right。根据逻辑编写脚本计算flag:
1 | list=[0x91,0x61,0x1,0xc1,0x41,0xa0,0x60,0x41,0xd1,0x21,0x14,0xc1,0x41,0xe2,0x50,0xe1,0xe2,0x54,0x20,0xc1,0xe2,0x60,0x14,0x30,0xd1,0x51,0xc0,0x17] |
creakme
把文件拖入IDA审计代码:
分析逻辑,就是将输入的明文每次取8位,前4位为v2,后4位为v3,并进行如图所示的32次循环加密,生成密文。不过由于循环了32次,所以我们再次循环32次就相当于解密回去了。编写脚本:
1 | import binascii |
Flag Checker
把apk扔进jeb里反编译,分析java代码:
加密逻辑看起来很复杂,其实简单说就是以v0为密钥对v4进行RC4加密,比较结果是否与密文相等,而v4的值就是flag,因此直接解密RC4就可以了:
WEB
easy_auth
这题挺神奇的,名字叫弱口令,结果和弱口令一点关系都没有。这题的实质是伪造jwt,关于jwt我之前介绍token的博客也写过了。先注册一个账号登录,登录时抓包发现token:
伪造的时候发现没有secret,因此密钥为空,所以我们只需要伪造中间那一部分就行了,id改为1,名称改为admin:
最后在本地储存中更改token,刷新页面拿到flag:
蛛蛛…嘿嘿♥我的蛛蛛
不会写脚本,很麻,手点到100关的,等wp出了研究下。
Tetris plus
游戏关10%改分,90%藏js里,这题很显然藏在js里。检查js,发现可疑目标:
翻阅发现jsfuck,解码得到flag:
Fujiwara Tofu Shop
经典的更改请求头的题目,考察http协议,这里就直接放最后的头文件了。要注意最后进行伪造本地请求时,不要用xff,否则你会得到出题人爱的关怀: