记一次GKCTF之旅

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.汉字的秘密

记一次GKCTF之旅

题目是个文件,打开就一堆汉字,当铺密码,解密结果如上所示。

解出来这么个东西,然后,,,

然后题目提示flag{小写字母},出题的小姐姐告诉flag是可读字符串,有“_”字符。

我开始以为这是把里面的小写字母提取出来,是“vk”,我联想到Virink师傅的id了(先自己嘲讽一下自己的脑洞),我以为这就是flag了......

事实证明我错了,这还是一个加密。上面的“v”和“k”是小写的,一个在第五位,一个在最后一位,flag{...}格式,“{”在第五位,“}”在最后一位,那么“EJ>C”对应的一定是“flag”这个字符串。

还是一个置换吧,“E”和“F”的差是,“J”和“L”的差是2,“>"和“A”的差是3,“C”和“g”的差是4。

记一次GKCTF之旅

验证一下,“{”的“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语言实现了一个虚拟的电脑,上面有登录系统,看来是需要找到密码了。

记一次GKCTF之旅

我们打开IDA,找到主函数,然后找到登录函数

记一次GKCTF之旅

这个代码段肯定负责密码校验,登录密码肯定在data段,strcmp那里进去看一下

记一次GKCTF之旅

可以看见登录密码应该是“HelloWorld”

记一次GKCTF之旅

假的flag,base64解码

Why don't you try migic brick game.

好嘛,去打砖块,然后就打出这个东西

记一次GKCTF之旅

这道题还有其他的解法,包括修改EIP,字符串直接base58解码,后面补充。

 

写在最后:还有一道宝可梦的虚拟器题目,比较脑洞,就不写了,但是用虚拟器改动汇编代码,修改游戏设置这个我觉得可以再研究一下。PWN题目杀我,后面学习了之后再来写。这次的题目挺有意思的,有时间把其他的题目都补充上来。

我是弱鸡

我是弱鸡

我是弱鸡

重要的事情说三遍。

上一篇:LeetCode 17. 电话号码的字母组合


下一篇:RabbitMQ如何实现延迟队列?(转)