zoukankan      html  css  js  c++  java
  • 记一次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加密一下

    这里还有另一种脚本,也更一下,下面的脚本直接通过求解逆元来解密仿射密码。

    import primefac
    import base64
    def modinv(a,n):
        return primefac.modinv(a,n)%n
    
    a=11
    n=26
    d,num,flag=modinv(a,n),0,""
    miwen="welcylk"
    table="abcdefghijklmnopqrstuvwxyz"
    for i in miwen:
        num=d*((ord(i)-97)-6)%26
        flag+=table[num]
    flag=base64.b64encode(flag)
    print(flag)

    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.

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

    补充一下,补充一下。

    我们最后看到的flag是直接输出了。一般这些直接输出的字符串存储在哪里呢?一般就是在全局数据段以数组的形式存储。那么在rdata段是不是可以直接找到flag呢?

     rdata段可以找到这样一串字符串:

    2i9Q8AtFJTfL3ahU2XGuemEqZJ2ensozjg1EjPJwCHy4RY1Nyvn1ZE1bZe
    import base58
    flag=base58.b58decode("2i9Q8AtFJTfL3ahU2XGuemEqZJ2ensozjg1EjPJwCHy4RY1Nyvn1ZE1bZe")
    print(flag)

    这样也可以解出flag。

    还有一种劫持eip的方法,后面再补充。

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

    我是弱鸡

    我是弱鸡

    我是弱鸡

    重要的事情说三遍。

  • 相关阅读:
    山寨 《寻找房祖名》
    css3 弹性效果上下翻转demo
    CSS3 Hover 动画特效
    判断一个字符串通过变化字符的位置,是否可以组成回文
    获取多个字符串中的共同字符
    转换为回文的步数
    IOS中图片的一些处理方法
    python django的一点笔记
    一个图片切割的例子
    一个批量修改文件夹中文件名的命令
  • 原文地址:https://www.cnblogs.com/L0g4n-blog/p/12957364.html
Copyright © 2011-2022 走看看