记一次院赛CTF的Crypto和Re题(入门)

目录

  • Crypto
    • easy crypto
    • bAcOn
    • 敌军密报
  • Re
    • easy re
    • 跳到对的地方
    • 简单的XOR
    • 多密码表替换

Crypto

easy crypto

记一次院赛CTF的Crypto和Re题(入门)_第1张图片

首先,这个可以很容易的看出这是一个base64加密一串密文,然后用base64解密后是

在这里插入图片描述
可以看出这就是flag的格式,所以一般就是凯撒加密了,但是因为有花括号下划线之类的,所以是凯撒的一个变形rot13
记一次院赛CTF的Crypto和Re题(入门)_第2张图片

bAcOn

这题是给了一个字符串baCoNBacoNbaconbACoNbacOnbAconBacOnbacoNbaconbacOnbACOnbACoN
可以看出给了我们的提示就是bacon,培根。
我这边的话是改了一个网上找的python代码,然后直接跑出来了。
记一次院赛CTF的Crypto和Re题(入门)_第3张图片
因为培根密码是有两张密码表,同时因为大小写的话也有种情况,解出来应该是有四种(我这边另外一种以小写字母为b以大写字母为a的显示结果没有放出来)

import re
alphabet = ['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']
first_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","babaa","babab","babba","babbb","bbaaa","bbaab"]
second_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","baabb","babaa","babab","babba","babbb"]
def decode():
    upper_flag = False  # 用于判断输入是否为大写
    e_string = input("please input string to decode:\n")
    e_string=change(e_string)
    print(e_string)
    if e_string.isupper():
        upper_flag = True
        e_string = e_string.lower()
    e_array = re.findall(".{5}",e_string)
    d_string1 = ""
    d_string2 = ""
    for index in e_array:
        for i in range(0,26):
            if index == first_cipher[i]:
                d_string1 += alphabet[i]
            if index == second_cipher[i]:
                d_string2 += alphabet[i]
    if upper_flag:
        d_string1 = d_string1.upper()
        d_string2 = d_string2.upper()
    print ("first decode method result is:\n"+d_string1)
    print ("second decode method result is:\n"+d_string2)
    return
def change(s):
    str=""
    for i in s:
        if(i>='a' and i<='z'):
            str+="a"
        if(i>='A' and i<='Z'):
            str+="b"
    return str
def change2(s):
    str=""
    for i in s:
        if(i>='a' and i<='z'):
            str+="b"
        if(i>='A' and i<='Z'):
            str+="a"
    return str
if __name__ == '__main__':
    print ("\t\tcoding by qux")
    while True:
        print ("\t*******Bacon Encode_Decode System*******")
        print ("input should be only lowercase or uppercase,cipher just include a,b(or A,B)")
        print ("1.encode\n2.decode\n3.exit")
        s_number = input("please input number to choose\n")
        if s_number == "1":
            encode()
            input()
        elif s_number == "2":
            decode()
            input()
        elif s_number == "3":
            break
        else:
            continue

敌军密报

记一次院赛CTF的Crypto和Re题(入门)_第4张图片
题目展示就是这样的,一个密文,以及一个文件可以下载。这边这个文件用记事本打开稍微看了一下,有很多类似.pyt、__main__之类的东西,所以应该就是一个python编译后的文件了,这边推荐一个在线反编译python的网站http://tools.bugscaner.com/decompyle/
记一次院赛CTF的Crypto和Re题(入门)_第5张图片

可以发现的是有四层加密
第一层凯撒加密
第二层base32
第三层base16
第四层栅栏加密取2

这边分享下我是如何分析这些代码是如何加密的。
在得到这个python代码后,每一种加密其实都可以单独取出来,然后自己定义一些需要加密的字符,然后可以看到加密后的内容,然后可以判段,如果判断不出来也没关系。
只需要将他的程序逆着写,然后将我们测试的加密后的内容,可以还原出加密前的字符,那么我们逆着的程序也就没有写错了。这样我们就能一步一步逆向出明文了。

Re

easy re

这一题是真的太没有难度了
记一次院赛CTF的Crypto和Re题(入门)_第6张图片
文本编辑器直接就搜出来了,当然更合适的做法肯定是用ida或od去搜

跳到对的地方

记一次院赛CTF的Crypto和Re题(入门)_第7张图片
这一题的话,就是考察最基本的od动态调试的跳转,使用中文搜索引擎,然后找到相应的内容,双击进去,就可以看到这句话所在的汇编代码段了。然后一般是选择push ebp去跳转就能进去了。

启动程序,这边比较直接的就是直接跳进去,找一个能执行到的地方,改下汇编,让他jmp到我们之前找到的地址。
记一次院赛CTF的Crypto和Re题(入门)_第8张图片
记一次院赛CTF的Crypto和Re题(入门)_第9张图片
当然,这样可能会导致我们程序崩溃,但是我们只是要这个flag,只要让他显示出来就好了。

简单的XOR

这题我当时是没有做出来的,只要当时没有找到真正的main函数,后来我发现一个找main函数的技巧。因为你直接运行那个需要你逆向的程序,是会出现一些信息的
记一次院赛CTF的Crypto和Re题(入门)_第10张图片
输入123,他提示我try again。于是可以在ida中搜索这个字符串,ALT+T。

记一次院赛CTF的Crypto和Re题(入门)_第11张图片
然后我就找到了他真正的main函数,很容易有木有

记一次院赛CTF的Crypto和Re题(入门)_第12张图片
记一次院赛CTF的Crypto和Re题(入门)_第13张图片

找到了main函数,就可以看的出来,他就是要将我们输入的东西,和v11到v34的值进行异或,最后的结果要等于v35就是”hang_dian_xin_gong_ctf!!”。 这边需要的知识点就是,抑或的时候A ^ B=C那么A ^ C=B 、B ^ C=A就都成立了

于是写了个脚本
记一次院赛CTF的Crypto和Re题(入门)_第14张图片

就获得了flag
在这里插入图片描述

多密码表替换

找到main函数如下
记一次院赛CTF的Crypto和Re题(入门)_第15张图片
记一次院赛CTF的Crypto和Re题(入门)_第16张图片
我把它改写成python代码大概是这个意思
记一次院赛CTF的Crypto和Re题(入门)_第17张图片
记一次院赛CTF的Crypto和Re题(入门)_第18张图片
然后最后这个v14等于v10就是正确的

这样我们就知道v14,于是上面的代码中我们不知道的就只有需要我们输入的buf[]。所以写一个求buf的代码

记一次院赛CTF的Crypto和Re题(入门)_第19张图片

运行就能得到flag
在这里插入图片描述

你可能感兴趣的:(CTF)