GKCTF游记
昨天吧,去GKCTF玩了一下。题目很有意思,宝可梦也很好玩,我心情非常好,天台的风也很大......
不多说了,把昨天认真看过的几道题记录总结一下。这里特别感谢出题的二进制师傅们,感谢师傅们让我这个二进制彩笔做了一个下午的misc和密码学。
密码学
1.小学生的密码
题目给出的信息如下
e(x)=11x+6(mod 26)
密文:welcylk(flag为base64形式)
这是一个仿射加密。(这题昨天非常艹的就是手算算错,下次记得写脚本,叹气叹气)
仿射加密本质上还是一种单置换密码,置换密码我们最常见的就有凯撒密码。但是凯撒密码是一种移位密码,它实现了一个常数级别的置换(秘钥是区间为[0,26]的一个常数),而仿射密码实现的是一个一次的加密。
看到(mod 26),想到26个字母,这里应该实现的就是26个字母的一个闭环。
仿射函数的运算法则如下:
加密公式:Y=(AX+B)%26
解密公式:X=(A的逆元)*(Y-B)%26
写个脚本。
letter='abcdefghijklmnopqrstuvwxyz' word='welcylk' flag='' a=11 b=6 for i in word: for j in range(0,len(letter)): if i==letter[(a*j+b)%26]: flag+=letter[j] print(flag)
跑出来答案加个base64解密一下。
2.汉字的秘密
题目是个文件,打开就一堆汉字,当铺密码,解密结果如上所示。
解出来这么个东西,然后,,,
然后题目提示flag{小写字母},出题的小姐姐告诉flag是可读字符串,有“_”字符。
我开始以为这是把里面的小写字母提取出来,是“vk”,我联想到Virink师傅的id了(先自己嘲讽一下自己的脑洞),我以为这就是flag了......
事实证明我错了,这还是一个加密。上面的“v”和“k”是小写的,一个在第五位,一个在最后一位,flag{...}格式,“{”在第五位,“}”在最后一位,那么“EJ>C”对应的一定是“flag”这个字符串。
还是一个置换吧,“E”和“F”的差是,“J”和“L”的差是2,“>"和“A”的差是3,“C”和“g”的差是4。
验证一下,“{”的“v”的差值是5,“}”和“k”的差值是18。
miwen="EJ>CvSHMV7G9R9@?3k" flag='' i=0 for a in miwen: i+=1 flag+=chr(ord(a)+i) print(flag)
写个脚本,跑出:flag{you_are_good}。
逆向
1.check_in
一道逆向题目。出题师傅说在Github上看到的源码。这个项目在b站上其实也可以找得到源码。
这是一个用C语言实现了一个虚拟的电脑,上面有登录系统,看来是需要找到密码了。
我们打开IDA,找到主函数,然后找到登录函数
这个代码段肯定负责密码校验,登录密码肯定在data段,strcmp那里进去看一下
可以看见登录密码应该是“HelloWorld”
假的flag,base64解码
Why don't you try migic brick game.
好嘛,去打砖块,然后就打出这个东西
这道题还有其他的解法,包括修改EIP,字符串直接base58解码,后面补充。
写在最后:还有一道宝可梦的虚拟器题目,比较脑洞,就不写了,但是用虚拟器改动汇编代码,修改游戏设置这个我觉得可以再研究一下。PWN题目杀我,后面学习了之后再来写。这次的题目挺有意思的,有时间把其他的题目都补充上来。
我是弱鸡
我是弱鸡
我是弱鸡
重要的事情说三遍。